retrofit2 rx java 2 - как получить доступ к телу ответа при возникновении ошибки - PullRequest
0 голосов
/ 28 января 2020

Я использую Retrofit с Rx java для запроса к серверу.
мой сервер возвращает определенный json формат, который включает данные и определенное сообщение.
сервер возвращает http-ответ. все в порядке, если сервер возвращает код успеха (200).
, но я хочу, если сервер возвращает другой код, я управляю телом этого ответа.
например:
сервер возвращает 401, и я хочу прочитать тело ответа для сообщения show сервера.
но когда сервер другой код, дооснащение вызывает метод onError, и я не могу использовать тело ответа.
как решить эту проблему?
это мой метод

'' '

private void login(String username , String password){
    view.setLoading();
    source.loginUser(username, password)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<Response<LoginResult>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    disposable.add(d);
                }

                @Override
                public void onSuccess(Response<LoginResult> loginResult) {

                    if (loginResult.isSuccessful()){


                        }
                        else
         new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());

                    }



                @Override
                public void onError(Throwable e) {

           if there is a problem          
                }
            });

' ''
, и это мой метод интерфейса для модернизации

@POST("...")
Single<Response<LoginResult>> loginUser(@Query("username") String username, @Query("password") String password);

Ответы [ 2 ]

1 голос
/ 29 января 2020

Согласно информации здесь , так как вы уже используете Response<LoginResult>, вы должны иметь возможность привести Throwable к HttpException, а затем извлечь тело ответа.

In Kotlin:

if (e is HttpException) {
    val errorBody = (e as HttpException).response().errorBody()
}

In Java:

 if (e instanceof HttpException) {
     HttpException error = (HttpException)e;
     String errorBody = error.response().errorBody().string();
 }

Полный пример с использованием кода Java:

import retrofit2.HttpException

private void login(String username , String password){
    view.setLoading();
    source.loginUser(username, password)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<Response<LoginResult>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    disposable.add(d);
                }

                @Override
                public void onSuccess(Response<LoginResult> loginResult) {
                    if (loginResult.isSuccessful()){
                      // Handle success

                    } else {
                      // Handle login failure
                       new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());
                    }

                }

                @Override
                public void onError(Throwable e) {
                  // Get the error response:
                  if (e instanceof HttpException) {
                    HttpException error = (HttpException)e;
                    String errorBody = error.response().errorBody().string();
                    // Then parse the errorBody and extract the values you need
                  }
                }
            });
0 голосов
/ 04 февраля 2020

Я нахожу решение
в методе модификации onSuccess, когда код ответа равен 200, вы должны получить ответ от объекта body.
, но когда нет 200, вы должны получить ответ от errorBody;

новый Gson (). из Json (serverResultResponse.errorBody (). string (), ServerResult.class);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...