Получить код состояния ответа с помощью Retrofit 2.0 и RxJava
Я пытаюсь обновить до Retrofit 2.0 и добавить RxJava в свой проект android. Я делаю вызов api и хочу получить код ошибки в случае ответа на ошибку с сервера.
Observable<MyResponseObject> apiCall(@Body body);
и в вызове RxJava:
myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
        @Override
        public void onCompleted() {
        }
        @Override
        public void onError(Throwable e) {
        }
        @Override
        public void onNext(MyResponseObject myResponseObject) {
           //On response from server
        }
    });
В Retrofit 1.9 RetrofitError все еще существовал, и мы могли получить статус, выполнив:
error.getResponse().getStatus()
как вы это делаете с Retrofit 2.0 с помощью RxJava?
3 ответов
вместо объявления вызова API, как вы сделали:
Observable<MyResponseObject> apiCall(@Body body);
можно объявить так:
Observable<Response<MyResponseObject>> apiCall(@Body body);
у вас будет подписчик, как показано ниже:
new Subscriber<Response<StartupResponse>>() {
    @Override
    public void onCompleted() {}
    @Override
    public void onError(Throwable e) {
        Timber.e(e, "onError: %", e.toString());
        // network errors, e. g. UnknownHostException, will end up here
    }
    @Override
    public void onNext(Response<StartupResponse> startupResponseResponse) {
        Timber.d("onNext: %s", startupResponseResponse.code());
        // HTTP errors, e. g. 404, will end up here!
    }
}
таким образом, ответы сервера с кодом ошибки также будут доставлены в onNext и вы можете получить код по телефону reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
 EDIT: хорошо, я, наконец, добрался до того, что e-nouri сказал в своем комментарии, а именно, что только 2xx коды будут onNext. Оказывается, мы оба правы:--19-->
если вызов объявлен следующим образом:
Observable<Response<MyResponseObject>> apiCall(@Body body);
или даже этот
Observable<Response<ResponseBody>> apiCall(@Body body);
все ответы в конечном итоге в onNext, независимо от их кода ошибки. Это возможно, потому что все обернуто в Response объект путем дооснащения.
если, с другой стороны, вызов объявлен следующим образом:
Observable<MyResponseObject> apiCall(@Body body);
или это
Observable<ResponseBody> apiCall(@Body body);
действительно, только ответы 2xx будут идти в onNext. Все остальное будет завернуто в HttpException и направлен onError. Что также имеет смысл, потому что без Response фантик, что должны излучается в onNext? С учетом то, что запрос не был успешным, единственное разумное, что можно было бы испустить, было бы null...
вы должны отметить, что с Retrofit2 все ответы с кодом 2xx будет вызван из обратного вызова onNext () и остальной части HTTP коды как 4xx, 5xx будет вызываться на onError () обратный вызов, используя Котлин Я придумал что-то подобное в onError () :
mViewReference?.get()?.onMediaFetchFinished(downloadArg)
  if (it is HttpException) {
    val errorCode = it.code()
    mViewReference?.get()?.onMediaFetchFailed(downloadArg,when(errorCode){
      HttpURLConnection.HTTP_NOT_FOUND -> R.string.check_is_private
      else -> ErrorHandler.parseError(it)
    })
  } else {
    mViewReference?.get()?.onMediaFetchFailed(downloadArg, ErrorHandler.parseError(it))
  }
