web-dev-qa-db-ja.com

Retrofit 2.0でエラーを処理する方法

Retrofit 2.0でエラーを処理したい

例: _code=404_および_body=null_、ただしerrorBody()にはErrorModel(_Boolean status_および_String info_)のデータが含まれます。

これはerrorBody().content:_[text=\n{"status":false,"info":"Provided email doesn't exist."}]_です。

どうすればこのデータを取得できますか?

助けてくれてありがとう!

これは、レトロフィットリクエストのコードです。

_ResetPasswordApi.Factory.getInstance().resetPassword(loginEditText.getText().toString())
    .enqueue(new Callback<StatusInfoModel>() {
        @Override
        public void onResponse(Call<StatusInfoModel> call, Response<StatusInfoModel> response) {
            if (response.isSuccessful()) {
                showToast(getApplicationContext(), getString(R.string.new_password_sent));
            } else {
                showToast(getApplicationContext(), getString(R.string.email_not_exist));
            }
        }

        @Override
        public void onFailure(Call<StatusInfoModel> call, Throwable t) {
            showToast(getApplicationContext(), "Something went wrong...");
        }
    });
_
14
y07k2

エラー応答が来たときにデータを取得したい場合(通常200を除く応答コード)、onResponse()メソッドでそれを行うことができます:

if (response.code() == 404) {
    Gson gson = new GsonBuilder().create();
    YourErrorPojo pojo = new YourErrorPojo();
    try {
         pojo = gson.fromJson(response.errorBody().string(), YourErrorPojo.class);
         Toast.makeText(getApplicationContext(), pojo.getInfo(), Toast.LENGTH_LONG).show();
    } catch (IOException e) { }
}

YourErrorPojo.classを生成するときは、次の手順を実行します。

  1. Json Schema 2 Pojo に移動します

  2. Jsonを貼り付けて、ソースタイプJson、注釈Gsonを選択します

  3. あなたの例Jsonは:{"status":false,"info":"Provided email doesn't exist."}

  4. Previewをクリックすると、Pojoクラスが生成されます。

これをbuild.gradleに追加してください:compile 'com.google.code.gson:gson:2.7'

このソリューションではGsonを使用しましたが、Jsonresponse.errorBody().string()のように取得して処理できます。好きなように実行できます。

15
Yasin Kaçmaz

Retrofitは404を失敗と見なさないため、onSuccessに入ります。

response.isSuccessful()は、応答コードが200〜300の範囲にある場合はtrueであるため、そこにelseを入力します。

_if (response.isSuccessful()) {
    showToast(getApplicationContext(), getString(R.string.new_password_sent));
} else {
    // A 404 will go here

    showToast(getApplicationContext(), getString(R.string.email_not_exist));
}
_

ただし、応答が成功しなかったため、.body()では応答本文を取得できませんが、errorBody()では、要求が成功したときにerrorBodyが入力されますが、response.isSuccessful()はfalseを返します(ステータスコードが200-300でない場合)。

6
Tim

私はこのライブラリを使用しています Retrobomb 、そのレベルでシリアル化する必要はありません。使い方もカスタマイズも簡単です。各エラータイプまたはエラーコードの注釈をサポートしています。必要に応じて、すべてのエラーのラップを解除し、自分で処理できます。

@ErrorMapping(code = 401, errorType = Unauthorized.class)
@PATCH("/v1/widgets/{id}")
  Single<Widget> updateWidget(@Path("id") String id, @Body Widget widget);
3
schwertfisch

エラー応答が来たときにデータを取得したい場合(通常は200以外の応答コード)、onResponse()メソッドでそれを行うことができます。

override fun onResponse(call: Call<LoginData>?, response: Response<LoginData>?) {
    if (response != null) {
        if (response.code() == 200 && response.body() != null) {
            val loginData = response.body()
            if (loginData != null) {
                //Handle success case...
            }
        } else if (response.code() == 401) {
            val converter = ApiClient.getClient()?.responseBodyConverter<ErrorResponseData>(
                ErrorResponseData::class.Java,
                arrayOfNulls<Annotation>(0))
            var errorResponse: ErrorResponseData? = null
            errorResponse = converter?.convert(response.errorBody())
            if (errorResponse != null) {
                //Handle Error case..
            }
        }
    }
}
0
Brijesh L.N