2015-02-16 10 views
22

के माध्यम से इंटरसेप्ट और पुनः प्रयास करें मुझे OkHttp Interceptor के अंदर अनुरोध पुनः प्रयास करने की आवश्यकता है। उदाहरण के लिए आने वाले अनुरोध हैं जिन्हें Authorization टोकन की आवश्यकता है। यदि Authorization टोकन समाप्त हो गया है, तो सर्वर 403 कोड के साथ प्रतिक्रिया देता है। इस मामले में मैं एक नया टोकन पुनर्प्राप्त कर रहा हूं और उसी chain ऑब्जेक्ट का उपयोग करके फिर से कॉल करने का प्रयास कर रहा हूं।ओकेएचटीपी इंटरसेप्टर्स

लेकिन ओकेएचटीपी एक अपवाद फेंकता है, जिसमें कहा गया है कि आप उसी chain ऑब्जेक्ट के साथ दो अनुरोध नहीं कर सकते हैं।

java.lang.IllegalStateException: network interceptor [email protected] must call proceed() exactly once 

मुझे आश्चर्य है कि वहाँ OkHttp Interceptor के अंदर पुन: प्रयास नेटवर्क अनुरोध के इस समस्या के लिए एक साफ समाधान है तो क्या होगा?

धन्यवाद

public final class ApplicationApiHeaders implements Interceptor { 
    private static final String AUTHORIZATION = "Authorization"; 
    private TokenProvider mProvider; 

    public ApplicationApiHeaders(TokenProvider provider) { 
     mProvider = provider; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Token token = mProvider.getApplicationToken(); 
     String bearerToken = "Bearer " + token.getAccessToken(); 

     System.out.println("Token: " + bearerToken); 
     Request request = chain.request(); 
     request = request.newBuilder() 
       .addHeader(AUTHORIZATION, bearerToken) 
       .build(); 

     Response response = chain.proceed(request); 
     if (!response.isSuccessful() && isForbidden(response.code())) { 
      Token freshToken = mProvider.invalidateAppTokenAndGetNew(); 
      String freshBearerToken = freshToken.getAccessToken(); 

      Request newRequest = chain.request(); 
      newRequest = newRequest.newBuilder() 
        .addHeader(AUTHORIZATION, freshBearerToken) 
        .build(); 

      response = chain.proceed(newRequest); 
     } 

     return response; 
    } 

    private static boolean isForbidden(int code) { 
     return code == HttpURLConnection.HTTP_FORBIDDEN; 
    } 
} 

उत्तर

36

उपयोग .interceptors() बजाय .networkInterceptors() की जो एक बार से अधिक .proceed() कॉल करने के लिए अनुमति दी जाती है।

अधिक जानकारी के लिए देखें: https://github.com/square/okhttp/wiki/Interceptors

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