欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();

亲测有效,附日志截图一张:

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

可以看到,原先的参数只有一个,拦截器处理后我们的公共参数就加入进入了,这个拦截器是不是很吊
总结:拦截器可以处理很多东西,添加头文件head,如果你的请求时有要求加密的也可以在这里处理,头文件的添加的基本思路跟公共参数的添加基本一样,加密的话还要考虑返回的Response 的解密,我自己项目需求有用到,下篇细说。

相关标签: retrofit