Consumir One-Shot ResponseBody de Okhttp causa problemas con Retrofit

Estoy utilizando un Retrofit con un interceptor Okhttp para detectar si mi token oauth ha caducado. Si el token ha caducado, quiero solicitar un nuevo token, intentar la solicitud de nuevo y, a continuación, enviar 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 un solo disparo como el estado de documentos Okhttp.

Esto significa que la respuesta devuelta al final del código ya no contendrá el cuerpo cuando se pasa a retrofit. ¿Hay alguna manera de que pueda consumir el cuerpo mientras todavía lo devuelve con la respuesta?

¡Gracias!

Logré esto creando una nueva respuesta usando el Response.Builder . Soy capaz de utilizar responseBodyString para mis cheques; Entonces vuelvo newResponse , que se da el cuerpo que consumí.

 Request request = chain.request(); Response response = chain.proceed(request); ResponseBody responseBody = response.body(); String responseBodyString = response.body().string(); Response newResponse = response.newBuilder().body(ResponseBody.create(responseBody.contentType(), responseBodyString.getBytes())).build(); ... return newResponse; 
  • ¿Necesito escribir un código de manejo de proxy personalizado para OkHttp en Android?
  • Android OkHttp con autenticación básica
  • Tienda de cookies persistente con okhttp 2 en Android
  • Subir un archivo grande en varias partes usando OkHttp
  • Retrofit "java.net.ProtocolException: Línea de estado inesperado", ¿Alguien?
  • Detectar si la respuesta OkHttp proviene de caché (con Retrofit)
  • OkHttp SSL handshake abortado en Android
  • Http sesión siempre se crea en la versión Android ModernHttpClient (okHttp1.5)
  • Volley + OkHttp en Android da error en la respuesta de estado 200
  • ¿Es posible inhabilitar los siguientes redireccionamientos en OkHttp 2.0?
  • OKhttp PUT ejemplo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.