私は、アプリケーションのネットワーク要求を行うためにRetrofitでOkHttpを使用しています。また、必要に応じて、認証用のインターセプタとリクエストの再試行も使用しています。OKHttpインターセプタからエラーを返す(改造を使用)
サーバには一時的な問題があり、応答ステータスが200 OKであるにもかかわらず空のボディを返すことがあります。 Retrofitコールバックの成功ブロックが呼び出され、返された(およびGSONで解析された)カスタムオブジェクトがnullであり、成功コールバックのコードがオブジェクトが返されたと仮定しているため、これによりアプリケーションがクラッシュします。
これは既にサーバーチームに報告されていますが、すべての成功コールバックコードをヌルチェックですべてラップする必要はありません。
Currenty他のアイデアは大歓迎ですが、私は、二つのオプションに傾いています: 1)インターセプタから戻っていないが(これも可能です)だけエラーダイアログ 2を表示)レトロフィットを行います何かを返します?コールバックの失敗部分を呼び出します。
私のコードは以下の通りです。ご覧のとおり、空のボディを受け取った場合、最大3回のリクエストを再試行します。
@Override
public Response intercept(Chain chain) throws IOException
{
// First
Request request = chain.request();
Response response = chain.proceed(request);
....
....
....
// Retry empty body response requests for a maximum of 3 times
Integer retryMaxCount = 3;
MediaType contentType = response.body().contentType();
String bodyString = response.body().string();
while (bodyString.length() == 0 && retryMaxCount > 0)
{
//Empty body received!, Retrying...
retryMaxCount--;
response = chain.proceed(request);
bodyString = response.body().string();
}
if (bodyString.length() != 0)
{
// Create and return new response because it was consumed
ResponseBody newResponseBody = ResponseBody.create(contentType, bodyString);
return response.newBuilder().body(newResponseBody).build();
}
else
{
// WHAT TO WRITE HERE???
}
}
ありがとうございます。
なぜインターセプタから例外をスローしないのですか? – mastov
ありがとうございました。それは簡単だった。あなたが答えとして投稿するなら、私はそれを受け入れるでしょう。 :) –
@mastov あなたがエラーを投げた場合、あなたのアプリはクラッシュしませんか?どのようにエラーを処理する/それをコールバックに伝播するのですか? – Singed