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:
- InterruptedIOException al usar Retrofit2 con rx cuando retryOn
- Descargar archivo binario de OKHTTP
- ¿Cómo obtener un cuerpo de respuesta para la excepción de actualización?
- Cookie de sesión no es persistente en Retrofit Android
- Causado por: java.lang.NoClassDefFoundError: Clase no encontrada usando el cargador de clase de arranque; No hay rastro de la pila disponible
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!
- Retrofit invoca el método failure () incluso cuando el código de estado de los encabezados es 200
- Cómo implementar la manipulación de cookies en Android usando OkHttp?
- Biblioteca de OkHttp - NetworkOnMainThreadException en la publicación simple
- Cómo agregar varios encabezados con ok Http
- Añadir cookie a la solicitud del cliente OkHttp
- Retrofit 2 tutorial ejemplo, pero GsonConverterFactory error de visualización "No se puede resolver el símbolo"
- OkHttpClient tiene un recuento máximo de reintentos
- Progreso de descarga con RxJava, OkHttp y Okio en Android
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;
Puede utilizar Interceptor de registro https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor
- ¿Establecer ubicación de instalación para Android 1.6?
- ¿Cómo saber si dos imágenes se intersecan mientras una imagen se mueve en android?