2016-08-30 2 views
4

Я реализовал okhttp в моем клиенте android для сетевых вызовов.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

Вы должны поймать ошибочный ответ на body() потому что response.message() возвращает HTTP статусных сообщений.

В скриншоте поданный вами:

Статус расщепляется в OkHttp как response.code() для кода статуса HTTP, который 400 в вашем случае и response.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 = 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