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

来源:互联网 发布:3d平面设计软件 编辑:程序博客网 时间:2024/05/20 10:55


向请求头添加固定的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:有史以来最大的改进


原创粉丝点击