2015-04-21 4 views
15

Я пытаюсь использовать этот перехватчик для проверки подлинности:андроид - 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 пуст. Любая помощь будет оценена по достоинству.

ответ

22

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

... 

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(); 
+2

спасибо большое! resolved :) – aw4y

+2

Возможно, MediaType contentType = ** response **. body(). contentType() ;? –

+0

Спасибо за ResponseBody.create (contentType, bodyString); – Harry

Смежные вопросы