2015-04-21 16 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

बहुत बहुत धन्यवाद! हल किया गया :) – aw4y

+2

शायद मीडियाटाइप सामग्री टाइप = ** प्रतिक्रिया **। शरीर()। सामग्री टाइप() ;? –

+0

ResponseBody.create (ContentType, bodyString) के लिए धन्यवाद; – Harry

संबंधित मुद्दे