1. ホーム
  2. android

[解決済み] Retrofit 2.0とRxJavaを使ったレスポンスステータスコードの取得

2022-08-31 21:27:21

質問

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