Statt den API-Aufruf zu erklären wie Sie haben:
Observable<MyResponseObject> apiCall(@Body body);
Sie können auch es wie folgt erklären:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Sie haben dann einen Abonnenten wie folgt aus:
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!
}
}
So werden Serverantworten mit einem Fehlercode auch an onNext
geliefert und Sie können erhalten der Code durch den Aufruf reponse.code()
.
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
EDIT: OK, ich habe endlich um zu schauen, in welche E-nouri sagte in ihrem Kommentar, nämlich dass nur Codes 2xx zu onNext
zu werden. Es stellte sich heraus, dass wir beide recht:
Wenn der Aufruf wie folgt erklärt:
Observable<Response<MyResponseObject>> apiCall(@Body body);
oder diese sogar
Observable<Response<ResponseBody>> apiCall(@Body body);
alle Antworten in onNext
, unabhängig von ihrem Fehler am Ende wird Code. Dies ist möglich, weil alles in einem Response
Objekt von Retrofit verpackt ist.
Wenn auf der anderen Seite, wird der Anruf wie folgt erklärt:
Observable<MyResponseObject> apiCall(@Body body);
oder diese
Observable<ResponseBody> apiCall(@Body body);
in der Tat nur die 2xx Antworten auf onNext
gehen. Alles andere wird in eine HttpException
verpackt und an onError
gesendet. Was macht auch Sinn, denn ohne Response
wrapper was sollte an onNext
ausgegeben werden? Angesichts der Tatsache, dass die Anfrage nicht erfolgreich war, wäre die einzige vernünftige Emission null
...
Für Leute, die nach den HTTP-Codes 4xx suchen, enden sie als HttpException in onError. Das onNext wird nur das 2xx haben. –
Das ist interessant ... Ich habe es nochmal überprüft (https://gist.github.com/DavidMihola/17a6ea373b9312fb723b) und alle Codes, die ich probiert habe, enden in 'onNext' inklusive 404 usw. Ich habe Retrofit v2.0.0-beta3 benutzt . –
@ e-nouri: Ich habe meiner Antwort nur einen Absatz hinzugefügt, der Ihren Kommentar berücksichtigt! –