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

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

程序员文章站 2022-07-13 10:58:48
...
场景

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

为何做验证

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

流程图

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

实现逻辑

通过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,对请求数据转换,不嫌弃可以我的这个文章:点击打开链接


相关标签: okhttp