retrofit+okhttp+rxjava添加公共参数的记录
程序员文章站
2024-03-01 08:44:16
...
相信我们在使用retrofit+okhttp+rxjava请求的时候,被这种模式真的惊呆了,好用的一批,但是某些情况下我们又无从下手,比如今天我自己记录的添加公共参数和加密请求,因为添加公共参数和加密不像使用okhttp那样在请求的时候添加参数或者加密(解密的话在CallBack回调返回解密即可)。
但是但是。。。retrofit在构建的时候开放给我们一个东西,没错,就是拦截器Interceptor,这个东西可以说是很强大了,我们添加公共参数和加密都可以在这里做。
下面来看一段代码,思路是这样的,拦截原先的请求,重新构建请求的url就可以:
private class commonInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
//获取原先的请求
Request originalRequest = chain.request();
//重新构建url
HttpUrl.Builder builder = originalRequest.url().newBuilder();
//如果是post请求的话就把参数重新拼接一下,get请求的话就可以直接加入公共参数了
if(originalRequest.method().equals("POST")){
FormBody body = (FormBody) originalRequest.body();
for(int i = 0; i < body.size();i++){
Log.i("RequestFatory",body.name(i) + "---" + body.value(i));
builder.addQueryParameter(body.name(i),body.value(i));
}
}
//这里是我的2个公共参数
builder.addQueryParameter("mallId", SharedPreferManager.getInstance().getValue("mallId"))
.addQueryParameter("robotNo",SharedPreferManager.getInstance().getValue("robotNo"));
//新的url
HttpUrl httpUrl = builder.build();
Request request = originalRequest.newBuilder()
.method(originalRequest.method(),originalRequest.body())
.url(httpUrl).build();
return chain.proceed(request);
}
}
写到这,基本我们就都会使用了,只需要把commonInterceptor 添加进入就好,如下:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.retryOnConnectionFailure(true);
builder.connectTimeout(ConnectOutTime, TimeUnit.SECONDS);
builder.writeTimeout(ConnectOutTime, TimeUnit.SECONDS);
builder.readTimeout(ConnectOutTime, TimeUnit.SECONDS);
//TODO 添加公共参数
if(isAddCommon){
builder.addInterceptor(new commonInterceptor());
}
//TODO 日志拦截器(debug模式开启)
if(BuildConfig.DEBUG){
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
}
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(url)
.client(client)
.build();
亲测有效,附日志截图一张:
可以看到,原先的参数只有一个,拦截器处理后我们的公共参数就加入进入了,这个拦截器是不是很吊
总结:拦截器可以处理很多东西,添加头文件head,如果你的请求时有要求加密的也可以在这里处理,头文件的添加的基本思路跟公共参数的添加基本一样,加密的话还要考虑返回的Response 的解密,我自己项目需求有用到,下篇细说。