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