okhttp получить ответ об ошибке

Я реализовал okhttp в своем клиенте Android для сетевых вызовов.

Когда я получаю ответ об ошибке, я получаю код ошибки и текст, связанный с кодом, в виде сообщения, но я не получаю пользовательский ответ об ошибке, который сервер отправляет мне. В моем ответе на ошибку в реализованном коде сообщение, которое я получаю, это просто «Неверный запрос».

В то время как тот же ответ от браузера выглядит следующим образом. введите описание изображения здесь

Как мне получить сообщение об ошибке, которое сервер возвращает мне?

Мой код

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

Вот мой ответ в случае неудачи. введите описание изображения здесь


person ViVekH    schedule 30.08.2016    source источник
comment
Возможно, когда ваш запрос не выполнен, сервер отправляет код ошибки 400 и, следовательно, показывает вам неверный запрос, поэтому для ответа на ошибку вам также необходимо установить статус 200 и сообщение, тогда только он примет ответ от сервера.   -  person Vickyexpert    schedule 30.08.2016


Ответы (2)


Вам придется поймать ответ об ошибке с помощью 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 object = new JSONObject (response.body().string());
String messageString = object.getString("Message");
person Rohit Arya    schedule 30.08.2016
comment
response.body.string() возвращает что-то вроде этого okhttp3.internal.http.RealResponseBody@528ae030 - person ViVekH; 30.08.2016
comment
нет, response.body вам этого не даст. И явно выглядит эталоном своей памяти. Проверьте еще раз и попробуйте позвонить response.body().string(). - person Rohit Arya; 30.08.2016
comment
Я сделал то же самое, я понял, почему. Мне пришлось получить к нему доступ как к объекту json, см. обновленный код pastebin.com/Lp7eBnb2, также этот пост SO помог мне выясните это stackoverflow.com/a/36857049/3518278 обновил ваш ответ, я принимаю его. - person ViVekH; 30.08.2016
comment
Итак, вы хотите прочитать Message Объект тела? Что ж, в этом случае Да, вам придется преобразовать ответ String в объект JSON для чтения. Вы верно указали. - person Rohit Arya; 30.08.2016
comment
@ViVekH, проверьте обновленный код, он должен работать. :) - person Rohit Arya; 30.08.2016

если вы пытаетесь получить (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().string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                     }
                }
person Adarsh Vijayan P    schedule 29.09.2018
comment
Где я должен это сделать? Пожалуйста, уточните свой ответ. - person Xerus; 21.03.2019
comment
Если вы используете вызов Retrofit для ответа API, то этот переопределенный метод onResponse является частью responseCall.enqueue(Call call , Response response) - person Adarsh Vijayan P; 21.03.2019
comment
Я использую Retrofit с RxJava, видимо, я не получаю там объект Call:/ - person Xerus; 22.03.2019
comment
Ознакомьтесь с этим: Модернизация — простое руководство по Android - person Adarsh Vijayan P; 22.03.2019
comment
Я использовал robospice с okhttp. Теперь я перенес okhttp на okhttp3. Должен ли я использовать okhttp3 для RequestListener и spiceException. - person sejn; 19.09.2020