版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40543575/article/details/79832197
在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ctx).setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addQueryParam("publicParams", "1");
}
}).setConverter(new BaseConverter())
.build();
其实,这个方法已经过时了
我们只能通过拦截器来实现了
/**
* Author:AND
* Time: 2018/4/2.
* Email:[email protected]
* Description:基本拦截器
* Detail:
*/
public class CommonInterceptor implements Interceptor {
private final String source;
private final String appversion;
public CommonInterceptor(String source, String appversion) {
this.source = source;
this.appversion = appversion;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request oldRequest = chain.request();
// 添加新的参数
HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
.newBuilder()
.scheme(oldRequest.url().scheme())
.host(oldRequest.url().host())
.addQueryParameter("source", source)
.addQueryParameter("appVersion", appversion);
// 新的请求
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(authorizedUrlBuilder.build())
.build();
return chain.proceed(newRequest);
}
}
怎么使用呢?
Okhttp3使用了装饰者模式, 使用Builder添加Interceptor。
贴出来我的请求框架
//单例模式获取okhttp
public static OkHttpClient getOkHttpClient() {
//自定义拦截器
CommonInterceptor android = new CommonInterceptor("设备号", "版本号");
if (okHttpClient == null) {
synchronized (OkHttpClient.class) {
if (okHttpClient == null) {
// 添加公共参数拦截器
okHttpClient = new OkHttpClient.Builder()
//打印拦截器日志
.addInterceptor(android)
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
.build();
}
}
}
return okHttpClient;
}
就是这么暴力,已经添加上了!