[解決済み] 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()
RxJavaを使ったRetrofit 2.0では、どのように行うのでしょうか?
どのように解決するのですか?
あなたのようにAPIコールを宣言するのではなく
Observable<MyResponseObject> apiCall(@Body body);
このように宣言することもできます。
Observable<Response<MyResponseObject>> apiCall(@Body body);
すると、以下のようなSubscriberができあがります。
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です。
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
...
関連
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] AsyncTaskを複数回実行する
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] グリッドビューの高さが削減される
-
[解決済み] 実行に失敗しました app:processDebugResources Android Studio
-
[解決済み] WhatsAppでメッセージを送信する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HttpPostによる画像送信
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?