retrofit+okhttp+rxjava添加公共参数的记录

相信我们在使用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 的解密,我自己项目需求有用到,下篇细说。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值