使用OkHttp拦截器,添加统一参数

场景

大家的应用处于安全考虑,又没有加密呢?又没用一个一个加密参数做验证呢?如果没有那你们就太low了(当然对于懂逆向的这些都没啥用处),如果有你是如何做的呢?

为何做验证

处于安全考虑,http请求都是可以通过抓包工具抓取下来的(Fiddler),抓取下来,我就可以通过模拟请求发送你们的请求,做一款外挂,大伙也可以试试,抓别人的包,然后请求即可...,一般来说如何做呢?就是对一个参数经过一系列算法,然后服务端口回去验证此算法是否正确

流程图


实现逻辑

通过okhttp的拦截器,拦截请求体,对请求体做对应添加数据

所有请求添加请求头拦截器定义
   private Interceptor getHeaderIntercepter() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                request=request.newBuilder()
                        .addHeader("myHeader", "ok")
                        .addHeader("myHeader", "ok2")
                        .build();
                Response response = chain.proceed(request);
                return response;
            }
        };
    }
From表单添加所有参数
 private Interceptor getFromIntercepter() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                //参数就要针对body做操作,我这里针对From表单做操作
                if (request.body() instanceof FormBody) {
                    // 构造新的请求表单
                    FormBody.Builder builder = new FormBody.Builder();

                    FormBody body = (FormBody) request.body();
                    //将以前的参数添加
                    for (int i = 0; i < body.size(); i++) {
                        builder.add(body.encodedName(i), body.encodedValue(i));
                    }
                    //追加新的参数
                    builder.add("newKye", "newValue");
                    request = request.newBuilder().post(builder.build()).build();//构造新的请求体
                }

                Response response = chain.proceed(request);
                return response;
            }
        };
    }
GET请求追加参数
    private Interceptor getGetParameterIntercepter() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                if (request.method().equals("GET")) {
                    //如果是get请求
                    HttpUrl url = request.url();
                    HttpUrl newUrl = url.newBuilder()
                            .addEncodedQueryParameter("newKey", "newValue")
                            .addEncodedQueryParameter("newKey2", "newvalue2")
                            .build();
                    request = request.newBuilder()
                                        .url(newUrl).build();
                }

                Response response = chain.proceed(request);
                return response;
            }
        };
    }
万能请求加参数方法(例如JSON的post请求)
    private Interceptor getAddPIntercepter() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                RequestBody body = request.body();// 得到请求体
                Buffer buffer = new Buffer();// 创建缓存
                body.writeTo(buffer);//将请求体内容,写入缓存
                String parameterStr = buffer.readUtf8();// 读取参数字符串
                //如果是json串就解析 从新加餐 如果是字符串就进行修改 具体业务逻辑自己加

                //对应请求头大伙按照自己的传输方式 定义
                RequestBody requestBody = RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), parameterStr);
                request = request.newBuilder().patch(requestBody).build();

                Response response = chain.proceed(request);
                return response;
            }
        };
    }
总结

关于修改参数,可以从okhttp的拦截器做处理,也可以从Retrofit层做处理,如果是Retrofit层可以通过,自定义ConverterFactory,对请求数据转换,不嫌弃可以我的这个文章:点击打开链接


猜你喜欢

转载自blog.csdn.net/wenyingzhi/article/details/80510249
今日推荐