您的位置:首页 > 理论基础 > 计算机网络

Retrofit2 + OkHttp3下统一设置Http请求的Headers

2016-01-18 14:14 477 查看
近几天尝试使用Retrofit和OkHttp构建网络层,从官网配置了依赖链接后,惊奇的发现OkHttp3,Retrofit2,都与以前的版本不兼容,不仅包名不一样(OkHttp3.*,以前的版本是com.squareup.okhttp.*)而且很多方法也被删掉了,目前只有Retrofit2在网上有少许资料,OkHttp3只能参考官方文档了。

在构建网络层时会遇到一个问题就是要手动配置Http请求的Headers,写入缓存Cookie,自定义的User-Agent等参数,但是对于有几十个接口的网络层,我才不想用注解配置Headers,目前网上很多文章的方法真对这两个版本都不是很适用,有的给出的方法已经被删除,有的方法会报出异常 :(

在翻阅官方API文档整理后的方法如下:

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;

public class RetrofitAPIManager {

public static final String SERVER_URL = "url";

public static ClientAPI provideClientApi() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVER_URL)
.client(genericClient())
.build();
return retrofit.create(ClientAPI.class);
}

public static OkHttpClient genericClient() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.addHeader("Accept-Encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("Accept", "*/*")
.addHeader("Cookie", "add cookies here")
.build();
return chain.proceed(request);
}

})
.build();

return httpClient;
}
}
也就是使用Interceptor来拦截并重新设置请求头,测试可用

/**官方 doc查找记录 **/

OkHttp3下OkHttpClient的 List<Interceptor> interceptors()方法,返回的是一个不可编辑的列表,如果对其进行编辑会报出UnSupportedOperationException
Interceptor的典型使用场景,就是对request和response的Headers进行编辑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: