android response interceptor okhttp

Android-Interceptor OkHttp-respuesta ya "consumida"



response (1)

Estoy tratando de usar este interceptor para la autenticación:

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 shows expired token) { // get a new token (I use a synchronous Retrofit call) // create a new request and modify it accordingly using the new token Request newRequest = request.newBuilder()...build(); // retry the request return chain.proceed(newRequest); } // otherwise just pass the original response on return response; }

El problema es que mi cheque (la respuesta muestra el token caducado) no está relacionado con el estado, necesito verificar la respuesta real (contenido del cuerpo). Entonces, después de la verificación, la respuesta se "consume" y cualquier intento de preparar el cuerpo fallará.

He intentado "clonar" el búfer de respuesta antes de leer, como:

public static String responseAsString(Response response ){ Buffer clonedBuffer = response.body().source().buffer().clone(); return ByteString.of(clonedBuffer.readByteArray()).toString(); }

pero no funciona, el clonedBuffer está vacío. Cualquier ayuda será apreciada.


Yo mismo tuve el mismo problema, y ​​la solución que encontré fue consumir el cuerpo de la respuesta y generar una nueva respuesta con un nuevo cuerpo. Lo hice así:

... Response response = chain.proceed(request); MediaType contentType = response.body().contentType(); String bodyString = response.body().string(); if (tokenExpired(bodyString)) { // your logic here... } ResponseBody body = ResponseBody.create(contentType, bodyString); return response.newBuilder().body(body).build();