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.
InformationsquelleAutor Murat Ögat | 2015-09-19
Schreibe einen Kommentar