okhttp 获取失败响应

okhttp get failure response

我已经在我的 android 客户端中为网络调用实现了 okhttp。

当我收到失败响应时,我收到了失败代码和与代码相关的文本作为消息,但我没有收到服务器发送给我的自定义失败响应。 在我对已实现代码的失败响应中,我收到的消息只是 "Bad Request".

而来自浏览器的相同响应如下。

如何获取服务器返回给我的错误消息?

我的代码

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());
                             }
                         }
                     });
    }

这是我在失败时的回应。

您必须通过 body() 捕获错误响应,因为 response.message() returns HTTP 状态消息。

在您提供的屏幕截图中:

StatusOkHttp 中分解为 response.code() HTTP 状态代码,在您的情况下为 400response.message() 对于 HTTP 状态消息,在您的情况下是 Bad Request

响应的正文(成功或失败)是 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 object = new JSONObject (response.body().string());
String messageString = object.getString("Message");

如果您正在尝试从 Retrofit 响应中获取 (okhttp3.ResponseBody) errorResponse,请执行此操作..

                // Retrofit onResponseCall
                @Override
                public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {

                    if (response.errorBody() != null) {

                        try {
                            Log.e("errorResponse","" + response.errorBody().toString());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                     }
                }