2015-02-16 13 views
22

Tôi cần phải thử lại yêu cầu bên trong OkHttp Interceptor. Ví dụ: có yêu cầu đến cần mã thông báo Authorization. Nếu mã thông báo Authorization hết hạn, máy chủ trả về phản hồi với mã 403. Trong trường hợp này, tôi lấy một mã thông báo mới và cố gọi lại bằng cách sử dụng cùng một đối tượng chain.Chặn và thử lại cuộc gọi bằng phương tiện của Thiết bị chặn OkHttp

Nhưng OkHttp ném ngoại lệ, cho biết bạn không thể thực hiện hai yêu cầu với cùng một đối tượng chain.

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

Tôi tự hỏi liệu có giải pháp sạch cho vấn đề này khi thử lại yêu cầu mạng bên trong OkHttp Interceptor?

Cảm ơn bạn

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

Trả lời

Các vấn đề liên quan