1:首先使用OkHttpClient新建一个builder.(这里面的connect、writer、read如果只是测试可以不添加)
OkHttpClient.Builder U1builder = new OkHttpClient().newBuilder();
U1builder .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(new CustomQuery());
注意最后一行的addInterceptor就是我们自定义的拦截器了。
2: CustomQuery这个拦截器的详细代码如下:
public class CustomQuery implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = new GetRequest(request).getRequest(request);
return chain.proceed(request);
}
}
3:其中GetRequest是自定义的一个类,这里是GET请求,我们也可以新建一个POST请求的自定义类。
class GetRequest implements IRequestParam {
@Override
public Request getRequest(Request request) {
//添加公共参数
HttpUrl modifiedUrl = request.url().newBuilder()
.addQueryParameter("client","8002004342510669")
.addQueryParameter("account","760018592752" )
.addQueryParameter("type","resultType=json" )
.build();
return request.newBuilder().url(modifiedUrl).build();
}
}
4:其中IRequestParam就是一个简单的接口,其代码如下:(Request都是OKhttp3中的request)
public interface IRequestParam {
Request getRequest(Request request);
}
5: 我们也可以把第二步中的GetRequest这个类换成PostRequest,PostRequest这个类的详细代码如下:(其中FormBody也是OKhttp3这个包里面的类)
public class PostRequest implements IRequestParam{
public PostRequest() {
}
@Override
public Request getRequest(Request request) {
if (request.body() instanceof FormBody) {
FormBody.Builder builder = new FormBody.Builder();
FormBody formBody = (FormBody) request.body();
for (int i = 0; i < formBody.size(); i++) {
builder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
}
formBody = builder.addEncoded("client", "8002004342510669")
.addEncoded("account", "760018592752")
.addEncoded("resultType", "resultType=json")
.build();
request = request.newBuilder().post(formBody).build();
}
return request;
}
}
6:拦截器已经写好了,我们直接将第一步中的这个builder添加到Retrofit后面就可以了,在链式调用后面再点出来一个Client.代码如下:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(JsonOrXmlConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(U1builder.build())
.build();
7: 然后发送一个请求抓包查看一下结果,看看第三步中的client、account、type参数是否已经添加进去,如图:
可以看到GET请求的三个固定参数已经添加进去了,我这边只加了一个ptype参数。post请求就可以依葫芦画瓢,将第二步的GetRequest换成PostRequest即可。