2011-08-04 68 views
4

我有一個應用程序,我正在開發,需要我發佈數據到第三方API。自從一開始我一直在努力進行身份驗證,並且一直在推遲,現在我被卡住了。基本驗證POST在Android上失敗,但在C#中工作#

我已經使用Authenticator嘗試過,但已經閱讀所有關於如何似乎在某些Android的版本BUG:Authentication Example

我嘗試了好幾種不同的選擇,包括Apache Commons HTTP Library沒有成功。在完成所有這些之後,我決定確保API不是問題所在。所以我編寫了一個快速的WinForms程序來測試API,它在第一次嘗試時完美運行。所以,我從事的工作以及與這兩者一起工作的API看起來都很好,但我迫切需要一些關於Java代碼不工作的指導。

例子如下:該作品

C#代碼每次:

 System.Net.ServicePointManager.Expect100Continue = false; 
     // Create a request using a URL that can receive a post. 
     WebRequest request = WebRequest.Create(addWorkoutUrl); 
     // Set the Method property of the request to POST. 
     request.Method = "POST"; 
     // Create POST data and convert it to a byte array. 
     string postData = "distance=4000&hours=0&minutes=20&seconds=0&tenths=0&month=08&day=01&year=2011&typeOfWorkout=standard&weightClass=H&age=28"; 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     // Set the ContentType property of the WebRequest. 
     request.Headers["X-API-KEY"] = apiKey; 
     request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("username:password")); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     // Set the ContentLength property of the WebRequest. 
     request.ContentLength = byteArray.Length; 
     // Get the request stream. 
     Stream dataStream = request.GetRequestStream(); 
     // Write the data to the request stream. 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     // Close the Stream object. 
     dataStream.Close(); 
     // Get the response. 
     WebResponse response = request.GetResponse(); 
     // Display the status. 
     MessageBox.Show(((HttpWebResponse)response).StatusDescription); 
     // Get the stream containing content returned by the server. 
     dataStream = response.GetResponseStream(); 
     // Open the stream using a StreamReader for easy access. 
     StreamReader reader = new StreamReader(dataStream); 
     // Read the content. 
     string responseFromServer = reader.ReadToEnd(); 
     // Display the content. 
     MessageBox.Show(responseFromServer); 
     // Clean up the streams. 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

爲Android Java代碼,目前返回500:內部服務器錯誤,但我相信這是我的錯。

URL url; 
    String data = "distance=4000&hours=0&minutes=20&seconds=0&tenths=0&month=08&day=01&year=2011&typeOfWorkout=standard&weightClass=H&age=28"; 
HttpURLConnection connection = null; 
    //Create connection 
    url = new URL(urlBasePath); 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setConnectTimeout(10000); 
    connection.setUseCaches(false); 
connection.setRequestProperty("User-Agent","Mozilla/5.0 (compatible) "); 
    connection.setRequestProperty("Accept","*/*"); 
    connection.setRequestProperty("X-API-KEY", apiKey); 
    connection.setRequestProperty("Authorization", "Basic " + 
    Base64.encode((username + ":" + password).getBytes("UTF-8"), Base64.DEFAULT)); 
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
connection.setRequestProperty("Content-Length", "" + Integer.toString(data.getBytes("UTF-8").length)); 

    DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
    wr.write(data.getBytes("UTF-8")); 
    wr.flush(); 
    wr.close(); 
    statusCode = connection.getResponseCode(); 
    statusReason = connection.getResponseMessage(); 
    //At this point, I have the 500 error... 
+0

經過進一步的研究,我終於找到了問題的所在,儘管如何解決它仍然需要幫助。看起來,Android上的Base64編碼與C#有很大的不同,如果我跳過編碼並從C#中複製編碼的字符串,那麼它一切正常。 有沒有人有我在做Base64編碼錯誤的建議? – gtcompscientist

回答

3

我想出問題,最後如以上在評論中提及橫跨根源絆後的溶液。

我在示例中使用Base64.encode(),但我需要使用Base64.encodeToString()

不同之處在於encode()返回byte[]encodeToString()返回我期待的string

希望這會幫助其他人抓住這個。

0

這是一個更好的POST方法。

install-package HttpClient

然後:

public void DoPost() 
{ 
    var httpClient = new HttpClient(); 
    var creds = string.Format("{0}:{1}", _username, _password); 
    var basicAuth = string.Format("Basic {0}", Convert.ToBase64String(Encoding.UTF8.GetBytes(creds))); 
    httpClient.DefaultRequestHeaders.Add("Authorization", basicAuth); 
    var post = httpClient.PostAsync(_url, 
     new FormUrlEncodedContent(new Dictionary<string, string> 
      { 
       { "name", "Henrik" }, 
       { "age", "99" } 
      })); 

    post.Wait(); 
} 
0

我已經在Java中嘗試過這種

import java.io.*; 
import java.net.*; 

class download{ 
    public static void main(String args[]){ 
     try{ 
      String details = "API-Key=e6d871be90a689&orderInfo={\"booking\":{\"restaurantinfo\":{\"id\":\"5722\"},\"referrer\":{\"id\": \"9448476530\" }, \"bookingdetails\":{\"instructions\":\"Make the stuff spicy\",\"bookingtime\": \"2011-11-09 12:12 pm\", \"num_guests\": \"5\"}, \"customerinfo\":{\"name\":\"Ramjee Ganti\", \"mobile\":\"9345245530\", \"email\": \"[email protected]\", \"landline\":{ \"number\":\"0908998393\",\"ext\":\"456\"}}}}"; 

      Authenticator.setDefault(new Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("admin", "1234".toCharArray()); 
       } 
      }); 

      HttpURLConnection conn = null; 
      //URL url = new URL("http://api-justeat.in/ma/orders/index"); 
         URL url = new URL("http://api.geanly.in/ma/order_ma/index"); 
      conn = (HttpURLConnection) url.openConnection(); 

      conn.setDoOutput(true); 
      conn.setDoInput (true); 

      conn.setRequestMethod("POST"); 
      //conn.setRequestMethod(HttpConnection.POST); 
      DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
      outStream.writeBytes(details); 
      outStream.flush(); 
      outStream.close();   

      //Get Response 
      InputStream is = conn.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      StringBuffer response = new StringBuffer(); 

      while((line = rd.readLine()) != null) { 
       System.out.println(line); 
      } 

      rd.close(); 
      System.out.println(conn.getResponseCode() + "\n\n"); 
     }catch(Exception e){ 
        System.out.println(e);   
     } 
    } 
} 

這可能幫助。

相關問題