Consuming One-Shot ResponseBody von Okhttp verursacht Probleme mit Retrofit

Ich verwende ein Retrofit mit einem Okhttp-Interceptor, um festzustellen, ob mein oauth-Token abgelaufen ist. Wenn das Token abgelaufen ist, möchte ich ein neues Token anfordern, die Anforderung erneut versuchen und diese Antwort an Retrofit senden.

Hier ist meine Interceptor-Klasse:

public class CustomInterceptor implements Interceptor {

@Override
public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    // try the request
    Response response = chain.proceed(request);

    if (response.body().string().contains(Constants.TOKEN_AUTH_ERROR_MESSAGE)) {
        Log.v("retrofit_error", "token expired");

        //get current token, create headers
        OAuthTokenResponse expiredToken = SharedPreferencesUtil.getOAuthToken();

        OAuthTokenResponse newOauthToken = RestClient.getInstance().getTokenService().refreshOauthToken(expiredToken.getRefreshToken());

        //store new token, return
        SharedPreferencesUtil.saveOAuthToken(newOauthToken);

        // create a new request and modify it accordingly using the new token
        Request.Builder newRequestBuilder = request.newBuilder()
                .removeHeader("Authorization");

        Request newRequest = newRequestBuilder.addHeader("Authorization", SharedPreferencesUtil.getOAuthToken().getAccessToken()).build();
        // retry the request
        return chain.proceed(newRequest);
    }

    // otherwise just pass the original response on
    return response;
}

}

Das Problem besteht darin, dass beim Aufrufen von response.body.string () der ResponseBody verbraucht wird, da es sich um einen One-Shot-Wert handelt, wie in den Okhttp-Dokumenten angegeben.

Dies bedeutet, dass die am Ende des Codes zurückgegebene Antwort die Karosserie nicht mehr enthält, wenn sie zur Nachrüstung übergeben wird. Gibt es eine Möglichkeit, den Körper zu konsumieren, während ich ihn mit der Antwort zurückschicke?

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage