2016-03-04 28 views
5

Chúng tôi đang cố gắng di chuyển sang sử dụng Retrofit2 và tôi gặp sự cố với yêu cầu nơi chúng tôi cần chuyển một bộ tiêu đề được tạo động (được sử dụng cho phân tích) cho mọi yêu cầu.Cách tự động thiết lập danh sách tiêu đề trong Retrofit 2 (Android)

@Headers không được hỗ trợ ở cấp tham số và vì tên trường tiêu đề thay đổi dựa trên hoạt động hiện tại, tôi không thể sử dụng @Header.

Có cách nào để nối thêm tiêu đề ngay trước khi thực thi() không? (Tìm kiếm một cái gì đó tương tự như @ QueryMap/@ FieldMap nhưng cho tiêu đề)

LƯU Ý: Tôi không có danh sách tiêu đề trong khi khởi tạo máy khách (và do đó không thể sử dụng Bộ chặn để thực hiện việc này).

Trả lời

2

Bạn vẫn có thể (và phải) sử dụng Trình chặn.
Tất cả những gì bạn cần là một Kiến trúc nhỏ.

Trước tiên hãy tạo trình trợ giúp cung cấp các tiêu đề cần thiết.

public class AnalyticsHeader { 
private String analyticsHeaderName; 
private String analyticsHeaderValue; 

public void setHeaderValue(String header) { 
    this.analyticsHeaderValue = header; 
} 

public void setHeaderName(String header) { 
    this.analyticsHeaderName = header; 
} 

public String getHeaderName() { 
    return analyticsHeaderName; 
} 
public String getHeaderValue() { 
    return analyticsHeaderValue; 
} 
} 

Giữ một thể hiện của lớp này ở một nơi dễ tiếp cận bên trong ứng dụng của bạn, ví dụ như MainActivity của chúng tôi ứng dụng (hoặc thậm chí tốt hơn, sử dụng Dependency Injection)

Bây giờ, khi tạo của Interceptor chỉ cần vượt qua trường hợp của các AnalyticsHeader vào Interceptor:

public static final class AnalyticsInterceptor implements Interceptor { 
     private final AnalyticsHeader header; 

     public AnalyticsInterceptor(AnalyticsHeader header) { 
      this.header = header; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      final Request original = chain.request(); 
      Response response; 
      if (header.getHeader() != null) { 
       Request request = original.newBuilder() 
         .header(header.getHeaderName(), header.getHeaderValue()) 
         .method(original.method(), original.body()) 
         .build(); 
       response = chain.proceed(request); 
      } else { 
       response = chain.proceed(original); 
      } 

     return response; 
     } 
} 

Và sau đó ...

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.addInterceptor(new AnalyticsInterceptor(CentralPlaceInApp.getAnalyticsHeader()); 
... 
retrofit = new Retrofit.Builder() 
       .baseUrl(config.getRestUrl()) 
       .client(builder.build()) 
       .build(); 

Bây giờ, bạn có thể thay đổi giá trị của tiêu đề bất cứ lúc nào trong thời gian chạy ứng dụng bằng cách sử dụng CentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName());

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