2015-04-21 9 views
15

Ich versuche, diese Abfangjäger für die Authentifizierung zu verwenden:Android - OkHttp Interceptor - Antwort bereits "verbraucht"

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

Das Problem ist, dass mein Scheck (Antwort abgelaufen Token zeigt) ist zustandsbezogene, I muss die tatsächliche Antwort (Körperinhalt) überprüfen. Also nach der Überprüfung wird die Antwort "konsumiert" und jeder Versuch, den Körper vorzubereiten, wird fehlschlagen.

Ich habe versucht, zu „klonen“ der Antwortpuffer vor lesen, wie:

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

, aber es funktioniert nicht, ist der clonedBuffer leer. Jede Hilfe wird geschätzt.

Antwort

22

Ich hatte gerade das selbe Problem selbst, und die Lösung, die ich fand, war, den Körper der Antwort zu konsumieren und eine neue Antwort mit einem neuen Körper zu bauen. Ich habe es so gemacht:

... 

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

vielen Dank! gelöst :) – aw4y

+2

Vielleicht MediaType contentType = ** Antwort **. body(). contentType() ;? –

+0

Danke für ResponseBody.create (contentType, bodyString); – Harry

Verwandte Themen