невозможно проанализировать объект ответа, если код состояния HTTP содержит ошибку - PullRequest
0 голосов
/ 25 июня 2018

Я вызываю один веб-сервис, использующий `RxJava2 'в android native следующим образом.Проблема заключается в том, что в случае ошибки сторонний веб-сервис возвращает ошибку кода состояния HTTP с описанием ошибки в объекте ошибок отдельно.

Теперь проблема заключается в том, что служба возвращает код состояния HTTP 422, вызов rxjava падаетпод onError и из-за этого я не могу разобрать Response объект, который имеет errors[] массив.

ответ от службы

(код статуса HTTPэто 422 необработанных объекта)

{
    "fitness": [],
    "errors": [
        {
            "code": 409,
            "message": "Conflict",
            "errors": "Activity is already taken",
            "activity_id": "100"
        }
    ]
}

код Android

fitnessFlowable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .takeUntil(response->response.getSummary().getNext()!=null)

            .subscribe(new Subscriber<Response>() {
                @Override
                public void onSubscribe(Subscription s) {

                    s.request(Long.MAX_VALUE);
                }

                @Override
                public void onNext(Response response) {

                    Log.e(TAG, "onNext" );

                    if(response !=null){

                        if(response.getFitness()!=null && response.getFitness().size()!=0){

                            Realm realm = Realm.getDefaultInstance();
                            realm.executeTransactionAsync(new Realm.Transaction() {
                                @Override
                                public void execute(Realm realm) {

                                    realm.copyToRealmOrUpdate(response.getFitness());

                                }
                            }, new Realm.Transaction.OnSuccess() {
                                @Override
                                public void onSuccess() {

                                    Log.i(TAG, "onSuccess , fitness data saved");

                                }
                            }, new Realm.Transaction.OnError() {
                                @Override
                                public void onError(Throwable error) {
                                    Log.i(TAG, "onError , fitness data failed to save"+error.getMessage() );
                                }
                            });
                        }else{

                            Log.i(TAG, "onError , no fitness data available" );


                        }

                    }else{
                        Log.i(TAG, "onError , response is null" );

                    }
                }

                @Override
                public void onError(Throwable t) {


                    Log.e(TAG, "onError" +t.getMessage());
                }

                @Override
                public void onComplete() {

                    Log.e(TAG, "onComplete");
                }
            });

1 Ответ

0 голосов
/ 25 июня 2018

Я полагаю, что ваша проблема уже решена в этой теме: Как получить тело ответа при возникновении ошибки при использовании Retrofit 2.0 Observables .

Но в основном то, что вам нужно сделатьчтобы получить HttpException из Throwable onError, а затем получить responseBody из этого исключения

public void onError(Throwable t) {
  if (t instanceof HttpException) {
     ResponseBody body = ((HttpException) t).response().errorBody();
     // Parse the body using gson
  }
  Log.e(TAG, "onError" +t.getMessage());
}
...