Я использую OkHttp с доработкой, чтобы выполнить сетевые запросы моего приложения. Я также использую Interceptors для аутентификации и, если необходимо, повторно запрашиваю запросы.Возврат ошибки из перехватчика OKHttp (с использованием модификации)
Сервер иногда имеет временные проблемы и возвращает пустое тело, хотя статус ответа 200 OK. Это приводит к сбою моего приложения, потому что вызывается блок успеха обратного вызова Retrofit, возвращенный пользовательский объект (и анализируется с помощью GSON) равен нулю, а обратный вызов с успешным кодом предполагает, что объект возвращается.
Я уже сообщал об этом команде сервера, но я также хочу исправить ее, не сворачивая весь код обратного вызова во всем приложении с нулевыми проверками.
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