【问题标题】:How to dynamically set list of headers in Retrofit 2 (Android)如何在 Retrofit 2 (Android) 中动态设置标题列表
【发布时间】:2016-03-04 08:13:12
【问题描述】:

我们正在尝试迁移到使用 Retrofit2,但我遇到了一个要求,即我们需要为每个请求传递一组动态生成的标头(用于分析)。

参数级别不支持@Headers,并且由于标题字段名称因当前活动而异,因此我无法使用@Header。

有没有办法在 execute() 之前附加标头? (寻找类似于@QueryMap/@FieldMap 的东西,但用于标题)

注意:初始化客户端时我没有标头列表(因此无法使用拦截器来执行此操作)。

【问题讨论】:

    标签: android retrofit retrofit2


    【解决方案1】:

    您仍然可以(并且必须)使用拦截器。
    您只需要一点架构。

    首先创建一个提供必要标头的助手。

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

    将此类的实例保存在应用程序内可访问的位置,例如 MainActivity 我们的应用程序(或者甚至更好,使用依赖注入)

    现在,在创建拦截器后,只需将 AnalyticsHeader 的实例传递给拦截器:

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

    然后……

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

    现在,您可以在应用运行时随时使用 CentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName()); 更改标头的值

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多