Retrofit如何添加请求头

retrofit的请求头添加从添加方式来说可以分为三种情况,静态、动态和全局。

静态添加

静态添加是用于在定义请求时就明确知道需要添加那些请求头
比如下面的接口需要添加一个apikey的请求头及一个cityname的url请求参数

public interface WeatherService {
    @Headers("apikey:b86c2269fe6588bbe3b41924bb2f2da2")
    @GET
    Call<WeatherWrapper> weather(@Url String url, @Query("cityname") String cityName);
}

如果有多个请求头也可以定义成键值对的样式

@Headers({
    "key1:value1",
    "key2:value2"   
})

上面的两种写法,适用于键和值都明确的情况。在值还不确定的时候我们可以把请求头像请求参数一样写到括号里,加上@Header注解就可以。算是一种狭义上的伪动态写法

@GET
Call<WeatherWrapper> weather(@Header("apikey") String apikey, @Url String url, @Query("cityname") String cityName);

动态添加

动态添加用于请求头是变化的,键和值都需要根据具体的情况才能确定,这时我们会需要@HeaderMap ,用一个map来提供请求头,具体写法如下

@GET
Call<WeatherWrapper> weather(@HeaderMap Map<String, String> headers, @Url String url, @Query("cityname") String cityName);

全局添加

全局添加用于所有请求都需要带上的请求头,如手机型号、APP版本等等,这种显然不适合在每个请求上去添加@Header注解。全局添加需要用到拦截器

okHttpClientBuilder.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder()
                .header("token", "xxx")
                .header("token", "yyy");
        Request request = requestBuilder.build();
        return chain.proceed(request);
    }
});

需要注意的是这里的.header会导致重写,如果之前在url里定义了一个相同键的请求头,那么在这里会被从新赋值。如果不希望被覆盖,使用.addHeader()方法替换就可以了

延伸

既然用到了拦截器,添加公共请求头。那能不能一次性给所有请求头添加一个一样的参数?当然可以
如下:给每个请求添加一个access_token参数

okHttpClientBuilder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                HttpUrl originalHttpUrl = originalRequest.url();

                HttpUrl url = originalHttpUrl.newBuilder()
                        .addQueryParameter("access_token", AccessTokenKeeper.readAccessToken(MyApplication.getInstance()).getToken())
                        .build();
                Request request = originalRequest.newBuilder()
                        .url(url)
                        .method(originalRequest.method(), originalRequest.body())
                        .build();

                return chain.proceed(request);
            }
        });

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 10,427评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 26,262评论 1 45
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,167评论 0 27
  • 本网讯(新闻中心学生 单培培 卜文洁)“噼里啪啦”的鞭炮声还在家门外回响,门上悬着的大红灯笼将人的脸庞映得火红,门...
    安徽大学阅读 323评论 0 0
  • 1、每天告诉自己一次,我真的很不错。 2、生气是拿別人做错的事來惩罚自己。 3、生活中若沒有朋友,就像生活中沒有阳...
  • 我把5张餐桌摆成一条线,然后拿着那20枚硬币坐到最外面的桌子旁,对开发团队众人说:“咱们现在玩翻硬币游戏啦。我需要...
    吾真本阅读 1,006评论 0 5
  • 字符变量:char; 字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大小而定。函数succ、pred、...
    netppp阅读 318评论 0 0
  • 今晚哄睡女儿,去儿子卧室给他把加湿器定好时间,走到门口发现儿子卧室还亮着灯,以为他睡觉没关灯。推开门进去才发现他在...
    珍爱_48e5阅读 57评论 0 0