使用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,對請求數據轉換,不嫌棄可以我的這個文章:點擊打開鏈接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章