Получить код статуса ответа с использованием модифицированной версии 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?

594   3  

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. Оказывается, мы оба правы:

если вызов объявлен следующим образом:

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...

внутри onError метод положить на это получить код

((HttpException) e).code()

следует отметить, что по состоянию на 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))
  }

Comments

    Ничего не найдено.