2011-10-12 168 views
0

我正在與一個我無法更改的API進行通信,該請求在API端未經過驗證時發送400響應。這是一個有效的HTTP請求,但請求數據不會傳遞應用程序的驗證規則。在Android中獲取400 HTTP響應的響應正文?

400響應包含一個JSON負載,其中包含有關爲什麼請求未通過驗證的信息。

我似乎無法得到響應正文,因爲拋出了HttpRequestException。有誰知道如何檢索這個響應體?

try { 
     HttpUriRequest request = params[0]; 
     HttpResponse serverResponse = mClient.execute(request); 

     BasicResponseHandler handler = new BasicResponseHandler(); 
     String response = handler.handleResponse(serverResponse); 
     return response; 
    } catch(HttpResponseException e) { 
     // Threw HttpError 
     Log.d(TAG, "HttpResponseException : " + e.getMessage()); 
     Log.d(TAG, "Status Code : " + e.getStatusCode()); 
     // TODO API returns 400 on successful HTTP payload, but invalid user data 
     if(e.getStatusCode() == 400) { 
       // Information on API error inside Response body 
      } 
    } 
+2

請發送一些代碼 –

回答

0

這是我如何發送和獲取HTTP響應作爲byte[]。當然你可以改變如果你想的話,它可以串起來。

   byte[] buffer = new byte[1024]; 
       httpclient = new DefaultHttpClient(); 
       httppost = new HttpPost("http://www.rpc.booom.com"); 



       postParameters = new ArrayList<NameValuePair>(); 
       postParameters.add(new BasicNameValuePair("debug_data","1")); 
       postParameters.add(new BasicNameValuePair("client_api_ver", "1.0.0.0")); 
       postParameters.add(new BasicNameValuePair("device_identificator", deviceId)); 
       postParameters.add(new BasicNameValuePair("device_resolution", resolution)); 
       postParameters.add(new BasicNameValuePair("username_hash", hashUser(username,password))); 
       postParameters.add(new BasicNameValuePair("password_hash", hashPass(username,password))); 

       httppost.setEntity(new UrlEncodedFormEntity(postParameters)); 

       HttpResponse response = httpclient.execute(httppost); 
       Log.w("Response ","Status line : "+ response.getStatusLine().toString()); 
       buffer = EntityUtils.toString(response.getEntity()).getBytes(); 

希望它有幫助!

+1

優秀!感謝您也提供瞭如何獲取HTTP狀態代碼。乾杯 –

+0

@安迪勞頓,我不明白,你可以做'byte [] data = EntityUtils.toByteArray(response.getEntity());'!看到我更新的帖子。 –

+0

@ Android-Droid,'EntityUtils.toString(response.getEntity())。getBytes();'不是獲取字節數組的有效方法,因爲您「假設」存在對所有數據都是標準的編碼。而是使用'EntityUtils.toByteArray()'來代替。 –

6

這樣的事情,使用org.apache.http.util.EntityUtils

HttpRequestBase base = new HttpGet(url); 
HttpResponse response = httpClient.execute(base); 
String jsonString = EntityUtils.toString(response.getEntity()); 

PS:這是盲目的編碼,因爲我不知道你嘗試過什麼呢。

要獲取狀態代碼:

int statusCode = response.getStatusLine().getStatusCode(); 

要獲得字節數組實體主體:

byte[] data = EntityUtils.toByteArray(response.getEntity()); 
+0

謝謝! BasicResponseHandler拋出HttpException錯誤... EntityUtils讓我得到響應正文,無論HTTP狀態碼如何。 –

+0

即使在httpclient流利的情況下,它也適用於我! – Hemant