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