2016-08-30 95 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