web-dev-qa-db-fra.com

okhttp obtenir une réponse d'échec

J'ai implémenté okhttp dans mon Android pour les appels réseau.

Lorsque j'obtiens une réponse d'échec, j'obtiens le code d'échec et le texte lié au code sous forme de message, mais je n'obtiens pas la réponse d'échec personnalisée que le serveur m'envoie. Dans ma réponse d'échec dans le code implémenté, le message que je reçois est simplement "Bad Request".

Alors que la même réponse du navigateur est la suivante. enter image description here

Comment obtenir le message d'erreur que le serveur me renvoie?

Mon code

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

Voici ma réponse en cas d'échec. enter image description here

9
ViVekH

Vous devrez intercepter la réponse d'erreur par body() car response.message() renvoie un message d'état HTTP.

Dans la capture d'écran que vous avez fournie:

Status est décomposé en OkHttp comme response.code() pour le code d'état HTTP qui est 400 Dans votre cas et response.message() pour Message d'état HTTP qui est Bad Request Dans votre cas.

Le corps de la réponse (succès ou échec) est response.body(). Et si vous voulez l'obtenir en tant que String, alors appelez 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);
     }
}

Selon les commentaires:

Puisque vous voulez lire Message objet de la réponse, essayez de faire comme ceci:

JSONObject = new JSONObject (response.body().string());
String messageString =object.getString("Message");
10
Rohit Arya

si vous essayez de get (okhttp3.ResponseBody) errorResponse from Retrofit response faites ceci ..

                // 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
Adarsh Vijayan P