Retrofit 2.X使用详解之请求头


向请求头添加固定的cookie或者token的时候


public class CookieInterceptor implements Interceptor {


  private UserStorage mUserStorage;

  public CookieInterceptor(UserStorage mUserStorage) {
    this.mUserStorage = mUserStorage;
  }

  @Override public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();
    if (!TextUtils.isEmpty(mUserStorage.getCookie()) && !original.url()
        .toString()
        .contains("loginUsernameEmail")) {
      Request request = original.newBuilder()
          .addHeader("Cookie", "u=" + URLEncoder.encode(mUserStorage.getCookie()) + ";")
          .addHeader("Cookie", "u=" + URLEncoder.encode(mUserStorage.getToken()) + ";")
          .build();
      return chain.proceed(request);
    } else {
      for (String header : chain.proceed(original).headers("Set-Cookie")) {
        if (header.startsWith("u=")) {
          String cookie = header.split(";")[0].substring(2);
          if (!TextUtils.isEmpty(cookie)) {
            Constants.Cookie = cookie;
          }
        }
      }
    }
    return chain.proceed(original);
  }
}



from : http://blog.csdn.net/io_field/article/details/52263224



Retrofit提供了两个两种定义HTTP请求头字段的方法即静态和动态。静态头不能改变为不同的请求,头的键和值是固定的且不可改变的,随着程序的打开便已固定。在Retrofit 2.0中,OkHttp 是必须的,并且自动设置为了依赖。这样,我们又可以采用OkHttp添加请求头的方式添加请求头。

动态添加

    @Header
    String value:默认为"",参数名称

    @GET("/")
    Call<ResponseBody> query(@Header("Accept-Language") String lang);

    @HeaderMap

    @GET("/search")
    Call<ResponseBody> query(@HeaderMap Ma<String, String> headers);

静态添加

@Headers("Cache-Control: max-age=640000")
@GET("/tasks")
Call<List<Task>> getTasks();

@Headers({
    "X-Foo: Bar",
    "X-Ping: Pong"
})
@GET("/")
Call(ResponseBody) deleteObject(@Query("id") String id);

OkHttp 请求拦截器

    方式一:
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
        httpClient.addInterceptor(new Interceptor() {  
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                Request request = original.newBuilder()
                    .header("User-Agent", "Your-App-Name")
                    .header("Accept", "application/vnd.yourapi.v1.full+json")
                    .method(original.method(), original.body())
                    .build();

                return chain.proceed(request);
            }
    }

    方式二:
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
        httpClient.addInterceptor(new Interceptor() {  
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                Request request = original.newBuilder()
                    .addHeader("Cache-Control", "no-cache")
                    .addHeader("Cache-Control", "no-cache")
                    .method(original.method(), original.body())
                    .build();

                return chain.proceed(request);
            }
    }

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

    OkHtt请求头通过拦截器添加Header,两种方式的不同
    .header(key, val):如果key相同,最后一个val会将前面的val值覆盖
    .addHeader(key, val):如果key相同,最后一个val不会将前面的val值覆盖,而是新添加一个Header

参考资料

1.Retrofit 2.0:有史以来最大的改进


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值