Android – перехватчик OkHttp – ответ уже «поглощен»

Я пытаюсь использовать этот перехватчик для аутентификации:

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; } 

Проблема в том, что мой чек (ответ показывает истекший токен) не связан со статусом, мне нужно проверить фактический ответ (содержимое тела). Поэтому после проверки ответ «потребляется», и любая попытка подготовить тело не удастся.

Я попытался «клонировать» буфер ответа перед чтением, например:

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

Но он не работает, clonedBuffer пуст. Любая помощь будет оценена по достоинству.

Solutions Collecting From Web of "Android – перехватчик OkHttp – ответ уже «поглощен»"

У меня была одна и та же проблема, и решение, которое я нашел, состояло в том, чтобы поглотить тело ответа и создать новый ответ с новым телом. Я сделал это так:

 ... 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();