Получить код статуса ответа с использованием модифицированной версии 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. Оказывается, мы оба правы:если вызов объявлен следующим образом:
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)) }
Comments