2012-09-15 66 views
12

我正在嘗試使用ANDROID上的基本身份驗證在身體中接受JSON的URL上實現一個簡單的JSON發佈。Android - 帶基本身份驗證的HttpClient JSON POST

我試過HttpUrlConnection但我得到「未經授權」,我的數據被髮送到服務器。

我嘗試過的另一種方法是使用HttpClient,但現在我遇到了另一個問題。身份驗證完美,但數據不會發送到服務器...

可以肯定的是,我在簡單的Java項目(而不是Android環境)中設置了一個小測試。

這是我用來發送到服務器的代碼:

DefaultHttpClient httpClient = new DefaultHttpClient(); 
ResponseHandler<String> resonseHandler = new BasicResponseHandler(); 
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");  
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}")); 
postMethod.setHeader("Content-Type", "application/json"); 
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 
String response = httpClient.execute(postMethod,resonseHandler); 
System.out.println("response :" + response); 

在Java項目中的代碼運行完美。

當我在Android中嘗試完全相同的代碼時,我從服務器獲取internal server error,這意味着尚未收到JSON數據。

我真的不明白爲什麼這是在JAVA工作,但不是在Android。

,我想達到的效果,是下面的命令:

curl --dump-header - -H "Content-Type: application/json" -X 
POST --data '{"amount_adult":1, "object_id":13}' 
--user travelbuddy:travelbuddy http://localhost/api/v1/purchase/ 

回答

0

我想你不應該在URL

+0

謝謝您的回覆,我只是在此代碼「localhost」的說明,在現實中,我使用的域的完整路徑。 – user1674948

+0

從你的角度來看,將JSON body發佈到服務器的正確方法是什麼?也許這只是一個模擬器不工作? – user1674948

+0

你的代碼是正確的。如果您在模擬器中測試,請改用IP地址10.0.2.2。請參閱http://developer.android.com/tools/devices/emulator.html#networkaddresses。 – secondflying

2

最後,萬事俱備使用localhost。任何可能遇到此問題的人都是解決方案。

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 

這Base64.encodeToString附加一個額外的「\ n」來授權字符串的結尾。然後在服務器下一行「\ n」字符被視爲請求的主體,當然不正確。

更換所有新生產線在授權字符串將解決這一問題:

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
authorizationString.replace("\n", ""); 
    postMethod.setHeader("Authorization", authorizationString); 

容易修復,但很難找到;-)

26
String authorizationString = "Basic " + Base64.encodeToString(
    ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
    Base64.DEFAULT); 

...

實際上解決方案有點簡單:

String authorizationString = "Basic " + Base64.encodeToString(
     ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
     Base64.NO_WRAP); // <=== Do not add '\n' 
+1

很酷,它的工作原理! – marchinram

+0

我必須添加'「」+ authorizationString +「」'使其工作(HTTP請求無效)。 –

+0

現在它是'Base64.getEncoder()。encodeToString(...' – Bohemian

2

我認爲最簡單的方法是:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false));