2016-08-30 142 views
4

我已經在我的android客戶端中實現okhttp進行網絡調用。okhttp獲取失敗響應

當我得到失敗響應時,我得到失敗代碼和與代碼相關的文本作爲消息,但我沒有得到服務器發送給我的自定義失敗響應。 在我執行的代碼中的失敗響應中,我收到的消息只是「錯誤的請求」。

而來自瀏覽器的相同響應如下。 enter image description here

我如何得到服務器回饋的錯誤信息?

我的代碼

private void executeCall(Request request, final ResponseListener listener) { 
     mOKHttpClient.newCall(request) 
        .enqueue(new Callback() { 
         @Override 
         public void onFailure(Call call, IOException e) {        
          postFailure(listener, (String) call.request() 
                   .tag(),e.toString()); 
         } 

         @Override 
         public void onResponse(Call call, final Response response) throws IOException { 
          if(response.isSuccessful()) { 
           String responseString = response.body().string();         
           postSuccess(listener, (String)call.request().tag(), responseString); 
          } 
          else {         
           postFailure(listener, (String)call.request().tag(),response.code()+","+response.message()); 
          } 
         } 
        }); 
    } 

這是我在失敗的情況下的響應。 enter image description here

+0

當你的請求失敗,那麼可能服務器發送失敗代碼400,因此它向你展示了不好的請求,所以對於故障響應也需要設置狀態200和消息,然後只有它將接受來自服務器的響應 – Vickyexpert

回答

3

由於response.message()會返回HTTP狀態消息,您將必須通過body()捕獲錯誤響應。

在您提供的屏幕截圖:

狀態OkHttp分解像response.code()的HTTP狀態代碼是在您的情況400response.message()針對你的情況Bad Request HTTP狀態消息。

響應的主體(無論成功還是失敗)爲response.body()。如果您想將其作爲String,請致電response.body().string()

@Override 
public void onResponse(Call call, final Response response) throws IOException { 
    if(response.isSuccessful()) { 
     String responseString = response.body().string();         
     postSuccess(listener, (String)call.request().tag(), responseString); 
    } 
    else {    
     String errorBodyString = response.body().string();     
     postFailure(listener, (String)call.request().tag(),response.code()+","+errorBodyString); 
    } 
} 

按照評論:

既然你想從響應讀Message對象,嘗試這樣做:

JSONObject = new JSONObject (response.body().string()); 
String messageString =object.getString("Message"); 
+0

response.body.string()返回像這樣的okhttp3.internal.http。 RealResponseBody @ 528ae030 – ViVekH

+0

不,response.body不會給你的。它顯然看起來是它的記憶參考。再次檢查並嘗試調用'response.body()。string()'。 –

+0

我確實返回相同的,我想出了爲什麼。 我不得不訪問它作爲一個JSON對象, 看到更新的代碼 http://pastebin.com/Lp7eBnb2 也 這個SO後幫我弄明白 http://stackoverflow.com/a/36857049/3518278 更新了你的答案我接受它。 – ViVekH