2015-08-30 16 views
18

Tôi muốn chặn tất cả các câu trả lời nhận bởi các công cụ cho thêm, và quét mã lỗi HTTP, ví dụ lỗi 403.Retrofit - phản ứng Intercept toàn cầu

Tôi biết tôi có thể sử dụng sự thất bại (RetrofitError lỗi) gọi lại mọi yêu cầu và kiểm tra 403 nhưng tôi muốn trả lời toàn bộ.

Tôi có thể thấy rằng yêu cầu chặn là có thể, nhưng tôi không thấy tùy chọn tương tự để phản hồi.

Mọi đề xuất?

Trả lời

42

Tôi đã có thể thực hiện điều đó bằng cách thêm bộ chặn vào OkHttpClient mà trang bị thêm đang sử dụng.

Retrofix 2.x:

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); 
    clientBuilder. 
      addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request(); 
        Response response = chain.proceed(request); 
        if (response.code() == 403) { 
         handleForbiddenResponse(); 
        } 
        return response; 
       } 
      }); 


    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(API_BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(clientBuilder.build();) 
      .build(); 

Retrofit 1.x:

public class ForbiddenInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     Response response = chain.proceed(request); 
     if (response.code() == 403) { 
      handleForbiddenResponse(); 
     } 
     return response; 
    } 
} 



OkHttpClient okHttpClient = Utils.createUnsafeOkHttpClient(); 
okHttpClient.interceptors().add(new ForbiddenInterceptor()); 

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder() 
     .setEndpoint(API_BASE_URL) 
     .setClient(new OkClient(okHttpClient)); 
+0

bạn có thể giải thích những gì tôi nên suppoded để sử dụng cho ActivityFragmentInteraction –

+0

Tôi rất thích biết những gì doStuff() có thể làm việc này là một chuỗi nền. – KickingLettuce

+0

** RestAdapter ** –

0

Một khả năng khác là để ghi đè lên các phương pháp execute trong Retrofit của OkClient. Trong trường hợp của tôi, tôi đang tìm kiếm một phản ứng tiêu đề cụ thể, vì vậy nó đã đi một cái gì đó như thế này:

OkClient client = new OkClient(okHttpClient) { 
    @Override 
    public retrofit.client.Response execute(retrofit.client.Request request) throws IOException { 
     retrofit.client.Response response = super.execute(request); 

     // Do whatever with 'response', such as looking for the value of a particular header: 

     List<retrofit.client.Header> headers = response.getHeaders(); 
     for (retrofit.client.Header header : headers) { 
      if (MY_HEADER.equalsIgnoreCase(header.getName())) { 
       this.savedValue = header.getValue(); 
       break; 
      } 
     } 

     return response; 
    } 
}; 

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder() 
     .setEndpoint(API_BASE_URL) 
     .setClient(client); 
Các vấn đề liên quan