OkHttp攔截器獲取GET/POST請求參數並添加公共參數

我們在創建OkHttp客戶端時,可以添加各種攔截器,真的很香:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .addInterceptor(new XXXInterceptor())
        .addInterceptor(new YYYInterceptor())
        ....
        .build();

服務端經常需要我們做一些參數校驗的工作,需要在本地先把請求參數封裝起來再加密之類的,那麼我們可以用攔截器來實現獲取所有get或post參數,還可以添加一些公共參數,這樣就不用在每個接口定義那去加了:

private static class ParamsInterceptor implements Interceptor {
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";
    private static final String HEADER_KEY_USER_AGENT = "User-Agent";

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();
        HttpUrl.Builder urlBuilder = request.url().newBuilder();

        if (METHOD_GET.equals(request.method())) { // GET方法
            // 這裏可以添加一些公共get參數
            urlBuilder.addEncodedQueryParameter("key_xxx", "value_xxx");
            HttpUrl httpUrl = urlBuilder.build();
            
            // 打印所有get參數
            Set<String> paramKeys = httpUrl.queryParameterNames();
            for (String key : paramKeys) {
                String value = httpUrl.queryParameter(key);
                Log.d("TEST", key + " " + value);
            }
            
            // 將最終的url填充到request中
            requestBuilder.url(httpUrl);
        } else if (METHOD_POST.equals(request.method())) { // POST方法
        	// FormBody和url不太一樣,若需添加公共參數,需要新建一個構造器
            FormBody.Builder bodyBuilder = new FormBody.Builder();
            // 把已有的post參數添加到新的構造器
            if (request.body() instanceof FormBody) {
                FormBody formBody = (FormBody) request.body();
                for (int i = 0; i < formBody.size(); i++) {
                    bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
                }
            }
            
            // 這裏可以添加一些公共post參數
            bodyBuilder.addEncoded("key_xxx", "value_xxx");
            FormBody newBody = bodyBuilder.build();
            
            // 打印所有post參數
            for (int i = 0; i < newBody.size(); i++) {
            	Log.d("TEST", newBody.name(i) + " " + newBody.value(i));
            }

			 // 將最終的表單body填充到request中
            requestBuilder.post(newBody);
        }

        // 這裏我們可以添加header
        requestBuilder.addHeader(HEADER_KEY_USER_AGENT, getUserAgent()); // 舉例,調用自己業務的getUserAgent方法
        return chain.proceed(requestBuilder.build());
    }
}

爲了方便大家參考,我再補充一下import的包,因爲這裏OkHttp和Retrofit的一些類(比如Response)可能有重名,一定要各自用各自的,千萬不要導入錯了:

import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

我沒有水貼,在這裏插入圖片描述

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