okhttp的拦截器是个很强大方便的东西,链接缓存,log输出,请求过程的逻辑都可以做到。
我项目最近用来处理一个统一加密,逻辑:加密信息都要放在body里面,并且中间还要访问一次服务器接口拿一个加密用的接口。
interceptors在Retrofit是没办法直接添加要通个okhttp来设置。
添加代码interceptors:
new OkHttpClient.Builder().addInterceptor(集成了Interceptor的对象);
拦截器是可以添加多个。
new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl.Builder builder = request.url()
.newBuilder()
.addQueryParameter("_a",Base64.encode(appKey.getBytes());//这是在链接后面拼接公共参数
FormBody.Builder formBody = new FormBody.Builder();
formBody.add("_a",Base64.encode(appKey.getBytes());
//请求体定制
if(request.body() instanceof FormBody){
FormBody oidFormBody = (FormBody) request.body();
for (int i = 0;i<oidFormBody.size();i++){
formBody.add(oidFormBody.name(i),oidFormBody.value(i));
}
}
//红色部分是在url中添加统一的参数,蓝色部分是在表单中添加统一参数,一个get一个post,看服务器需要
Log.e(TAG+"GetUrl",""+ builder.build().url());
//重定向url,重置Request,拼接公共参数的请求urlRequest newRequest= request.newBuilder()
.url(builder.build().url())
.build();
return chain.proceed(newRequest);
}
}