web-dev-qa-db-ja.com

okhttp失敗の応答を取得

Androidクライアントにネットワークコール用にokhttpを実装しました。

失敗応答を受け取ると、失敗コードとコードに関連するテキストをメッセージとして受け取りますが、サーバーが送信するカスタム失敗応答を受け取りません。実装されたコードでの失敗応答では、私が受け取るメッセージは「Bad Request」だけです。

一方、ブラウザからの同じ応答は次のとおりです。 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

9
ViVekH

body()はHTTPステータスメッセージを返すため、response.message()によるエラー応答をキャッチする必要があります。

あなたが提供するスクリーンショットでは:

Statusは、OkHttpresponse.code()の場合はHTTPステータスコード、_400_はHTTPの場合response.message())あなたのケースでは_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 = new JSONObject (response.body().string());
String messageString =object.getString("Message");
_
10
Rohit Arya

あなたがしようとしている場合get(okhttp3.ResponseBody)errorResponse from Retrofit responseこれを実行します。

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

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

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