18

レトロフィット 2 の前は、エラーを一元的に処理する方法がありました -

new retrofit.RestAdapter.Builder()
        .setEndpoint(apiUrl)
        .setLogLevel(retrofit.RestAdapter.LogLevel.FULL)
        .setErrorHandler(new CustomErrorHandler(ctx))

しかし、Retrofit 2 では、RestAdapter の名前が に変更されRetrofitsetErrorHandler(). を使用して集中エラー処理を行う方法はありRetrofit.Builder()ますか?

4

4 に答える 4

6

Retrofit 2.0 は ErrorHandler を移動し、次のCallback2 つのメソッドを含む new を使用します。

/** Successful HTTP response. */
public void onResponse(Response<T> response, Retrofit retrofit)````

/** Invoked when a network or unexpected exception occurred during the HTTP request. */
public void onFailure(Throwable t)

onResponseRetrofit2.x は、http コードが 2xx または 3xx ではない場合でも、すべての HTTP 応答を受信します。ここでは、onResponseメソッドの応答ステータス コードを確認し、応答が成功したかどうかを確認する必要があります (通常は 2xx または 3xx)。ロジック処理。

私は retrofit2.x をアップグレードしました。一元化されたエラー処理に関する私の解決策は次のとおりです。 onSuccess と onFailed の 2 つのメソッドを使用して Retrofit.Callback を拡張する抽象クラスを作成します。リクエストが成功した場合の別のこと。サンプルコードはこちらから参照できます

次に、http リクエストを送信する必要がある場合は、onSuccess メソッドを実装する必要があり、場合によっては onFailed メソッドをオーバーライドすることもできます。私のプロジェクトで述べたように、ほとんどの場合、失敗を同じ方法で処理します。ここで、retrofit2 を使用して投稿リクエストを送信した例を参照できます。

これがあなたを助けることを願っています!

于 2016-01-27T08:32:06.180 に答える
0

Amirが提案するのと同様のソリューションを使用しましたが、これをさらに簡単にできるかどうか疑問に思っています. 私は次のことを試しました:

public void onResponse(Response<T> response) {
        if (response.isSuccess()) {
            T resp = response.body();
            handleSuccessResponse(resp);

        } else {
            Response<StatusResponse> statusResponse = response.error(response.code(), response.errorBody());
            handleHttpErrorResponse(statusResponse);
        }
    }

この方法では、Retrofit インスタンスを渡す必要はありません。ただし、エラー本文が StatusResponse に正常に解析されないため、何かが欠けています。これが実際に何を意味するのかわかりません:

Callback の onResponse コールバックに Retrofit インスタンスを提供していた 2.0.0-beta2 の変更は元に戻されました。エラー本文の逆シリアル化を許可するために、Retrofit オブジェクトを提供することに関して、あまりにも多くのエッジ ケースがあります。このユースケースに対応するには、Retrofit 応答を手動で渡すか、カスタム CallAdapter.Factory を実装して自動的に行います。

2.0.0-ベータ3

于 2016-02-12T07:34:13.137 に答える
0

401 に固有のケースを一元的に処理し、新しい認証トークンでリクエストを再試行する方法については、このスタック オーバーフローの回答を参照してください。

于 2018-09-16T05:40:56.493 に答える