我們在創建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;
我沒有水貼,。