あなたがしたように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
編集: OK、私はようやく、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です...