Consumir One-Shot ResponseBody de Okhttp causa problemas con Retrofit
Estoy usando un Retrofit con un interceptor Okhttp para detectar si mi token oauth ha expirado. Si el token ha expirado, quiero solicitar un nuevo token, vuelva a intentar la solicitud y luego envíe esa respuesta a Retrofit.
Aquí está mi clase de interceptor:
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;
}
}
El problema es que llamar a response.body.string () consumirá el ResponseBody debido a que es un valor de una sola vez como indica el estado de los documentos Okhttp.
Esto significa que la Respuesta que se devuelve al final del código ya no contendrá el cuerpo cuando se pase a la actualización. ¿Hay alguna manera de que pueda consumir el cuerpo mientras lo devuelvo con la respuesta?
¡Gracias!