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...");
}
});
_
エラー応答が来たときにデータを取得したい場合(通常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
を生成するときは、次の手順を実行します。
Json Schema 2 Pojo に移動します
例Json
を貼り付けて、ソースタイプJson、注釈Gsonを選択します
あなたの例Json
は:{"status":false,"info":"Provided email doesn't exist."}
Pojo
クラスが生成されます。これをbuild.gradle
に追加してください:compile 'com.google.code.gson:gson:2.7'
このソリューションではGson
を使用しましたが、Json
をresponse.errorBody().string()
のように取得して処理できます。好きなように実行できます。
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でない場合)。
私はこのライブラリを使用しています Retrobomb 、そのレベルでシリアル化する必要はありません。使い方もカスタマイズも簡単です。各エラータイプまたはエラーコードの注釈をサポートしています。必要に応じて、すべてのエラーのラップを解除し、自分で処理できます。
@ErrorMapping(code = 401, errorType = Unauthorized.class)
@PATCH("/v1/widgets/{id}")
Single<Widget> updateWidget(@Path("id") String id, @Body Widget widget);
エラー応答が来たときにデータを取得したい場合(通常は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..
}
}
}
}