Rückkehr Fehler von OKHttp interceptor (mit Nachrüstung)
Ich bin mit OkHttp mit Retrofit, um meine app-Anfragen im Netzwerk. Ich bin auch mit Abfangjägern, die für die Authentifizierung und Wiederholung bitten, wenn nötig.
Dem server hat manchmal vorübergehende Probleme, und gibt einen leeren Körper, obwohl die response status 200 OK. Dies bewirkt, dass meine app abstürzt, weil der Erfolg blockieren des Retrofit-Callback wird aufgerufen, das eigene Objekt zurückgegeben (und analysiert, mit GSON) null ist, und der code in der Erfolgs-callback wird ein Objekt zurückgegeben.
Habe ich bereits berichtet das an das server-team, aber ich möchte es zu beheben, ohne zu müssen, wickeln Sie alle success-callback-code über die app mit null überprüft.
Currenty bin ich geneigt, zu zwei Optionen, obwohl alle anderen Ideen sind herzlich willkommen:
1) Keine Rückkehr aus dem interceptor (ist das überhaupt möglich?) und einfach Anzeige ein Fehler-dialog
2) eine Rücknahme von etwas, das Retrofit nennen, das scheitern Teil des Rückrufs.
Mein code ist unten. Wie Sie sehen können, ich wiederholen Sie die Anfrage für einen maximal 3 mal, wenn ein leerer Körper empfangen wird.
@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???
}
}
Vielen Dank.
- Warum nicht werfen Sie eine exception vom interceptor?
- Vielen Dank. Das war ja einfach. Wenn Sie es post als Antwort werde ich es akzeptieren. 🙂
- Wenn Sie werfen einen Fehler gibt, wird Ihre app Abstürzen? Wie behandeln Sie Fehler/propagieren Sie um Rückruf?
- Nein, die app stürzt nicht ab. Das OnFailure-block des Retrofit-callback aufgerufen wird.
- Darüber hinaus, wenn Sie nur verwenden, OkHttp, ohne Retrofit2, Ihre app zum Absturz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte gerade das gleiche Szenario und dieser Beitrag hat mir geholfen, die Implementierung der Lösung. Dank @mastov zu zeigen in die richtige Richtung.
Arbeiten mit einem back-end-api, die immer wieder HTTP 200, auch wenn es ein Fehler war. Das war meine Antwort-Beispiel für einen Fehler
Hier ist eine einfache Implementierung als Ergänzung zu dieser Antwort.
Meine Lösung entnommen okhttp3.die Protokollierung.HttpLoggingInterceptor