okhttp攔截器的使用
阿新 • • 發佈:2019-02-12
本篇介紹OkHttp的攔截器的使用。
首先我們需要了解什麼事攔截器。打個比方,鏢局押著一箱元寶在行走在一個山間小路上,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮乾淨後將其放行。其中山賊相當於攔截器,鏢局相當於一個正在執行任務的網路請求,請求中的引數就是鏢局攜帶的元寶。攔截器可以將網路請求攜帶的引數進行修改驗證,然後放行。這裡面其實設計了AOP程式設計的思想(面向切面程式設計)。
1、攔截器可以一次性對所有的請求和返回值進行修改。
2、攔截器可以一次性對請求的引數和返回的結果進行編碼,比如統一設定為UTF-8.
3、攔截器可以對所有的請求做統一的日誌記錄,不需要在每個請求開始或者結束的位置都新增一個日誌操作。
4、其他需要對請求和返回進行統一處理的需求….
一、Application Interceptor是在請求執行剛開始,還沒有執行OkHttp的核心程式碼前進行攔截,Application攔截器的作用:
1、不需要擔心是否影響OKHttp的請求策略和請求速度。
2、即使是從快取中取資料,也會執行Application攔截器。
3、允許重試,即Chain.proceed()可以執行多次。(當然請不要盲目執行多次,需要加入你的邏輯判斷)
二、Network Interception是在連線網路之前(如圖,看圖一目瞭然)
1、可以修改OkHttp框架自動新增的一些屬性(當然最好不要修改)。
2、可以觀察最終完整的請求引數(也就是最終伺服器接收到的請求資料和熟悉)
其中通過addInterceptor新增應用攔截器,addNetworkInterceptor新增網路攔截器。
執行結果如下:
可以看到,從App Interceptor開始,然後執行Network Interceptor,最後又回到App Interceptor.
首先我們需要了解什麼事攔截器。打個比方,鏢局押著一箱元寶在行走在一個山間小路上,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮乾淨後將其放行。其中山賊相當於攔截器,鏢局相當於一個正在執行任務的網路請求,請求中的引數就是鏢局攜帶的元寶。攔截器可以將網路請求攜帶的引數進行修改驗證,然後放行。這裡面其實設計了AOP程式設計的思想(面向切面程式設計)。
-
攔截器的作用和好處。
1、攔截器可以一次性對所有的請求和返回值進行修改。
2、攔截器可以一次性對請求的引數和返回的結果進行編碼,比如統一設定為UTF-8.
3、攔截器可以對所有的請求做統一的日誌記錄,不需要在每個請求開始或者結束的位置都新增一個日誌操作。
4、其他需要對請求和返回進行統一處理的需求….
-
OkHttp中攔截器分類
一、Application Interceptor是在請求執行剛開始,還沒有執行OkHttp的核心程式碼前進行攔截,Application攔截器的作用:
1、不需要擔心是否影響OKHttp的請求策略和請求速度。
2、即使是從快取中取資料,也會執行Application攔截器。
3、允許重試,即Chain.proceed()可以執行多次。(當然請不要盲目執行多次,需要加入你的邏輯判斷)
二、Network Interception是在連線網路之前(如圖,看圖一目瞭然)
1、可以修改OkHttp框架自動新增的一些屬性(當然最好不要修改)。
2、可以觀察最終完整的請求引數(也就是最終伺服器接收到的請求資料和熟悉)
-
例項化一個攔截器
-
Interceptor appInterceptor = new Interceptor() {
-
@Override
-
public Response intercept(Chain chain) throws IOException {
-
Request request = chain.request();
-
//———請求之前————
-
Response response = chain.proceed(request1);
-
//———請求之後————
-
return response;
-
}
- };
複製程式碼
-
配置攔截器
-
okHttpClient = new OkHttpClient
-
.Builder()
-
.addInterceptor(appInterceptor)//Application攔截器
-
.addNetworkInterceptor(networkInterceptor)//Network攔截器
- .build();
複製程式碼
其中通過addInterceptor新增應用攔截器,addNetworkInterceptor新增網路攔截器。
-
示例程式碼
-
public class InterceptorActivity extends AppCompatActivity {
-
public static final String TAG = “androidxx”;
-
OkHttpClient okHttpClient;
-
/**
-
* 應用攔截器
-
*/
-
Interceptor appInterceptor = new Interceptor() {
-
@Override
-
public Response intercept(Chain chain) throws IOException {
-
Request request = chain.request();
-
HttpUrl url = request.url();
-
String s = url.url().toString();
-
//———請求之前—–
-
Log.d(TAG,”app interceptor:begin”);
-
Response response = chain.proceed(request);
-
Log.d(TAG,”app interceptor:end”);
-
//———請求之後————
-
return response;
-
}
-
};
-
/**
-
* 網路攔截器
-
*/
-
Interceptor networkInterceptor = new Interceptor() {
-
@Override
-
public Response intercept(Chain chain) throws IOException {
-
Request request = chain.request();
-
//———請求之前—–
-
Log.d(TAG,”network interceptor:begin”);
-
Response response = chain.proceed(request);
-
Log.d(TAG,”network interceptor:end”);
-
return response;
-
}
-
};
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_interceptor);
-
okHttpClient = new OkHttpClient
-
.Builder()
-
.addInterceptor(appInterceptor)//Application攔截器
-
.addNetworkInterceptor(networkInterceptor)//Network攔截器
-
.build();
-
}
-
public void click(View view) {
-
Request request = new Request.Builder().url(“http://www.androidxx.cn”).build();
-
okHttpClient.newCall(request).enqueue(new Callback() {
-
@Override
-
public void onFailure(Call call, IOException e) {
-
e.printStackTrace();
-
}
-
@Override
-
public void onResponse(Call call, Response response) throws IOException {
-
Log.d(TAG,”–” + response.networkResponse());
-
}
-
});
-
}
- }
複製程式碼
執行結果如下:
可以看到,從App Interceptor開始,然後執行Network Interceptor,最後又回到App Interceptor.
-
建議
如果對攔截器不是很熟的同學,開發過程中,建議使用Application Interception。這樣避免對OkHttp請求策略的破壞。
-
實際開發中的用途
1、對請求引數進行統一加密處理。
2、攔截不符合規則的URL。
3、對請求或者返回引數設定統一的編碼方式
4、其它…。
比如對URL進行驗證(如果Url中沒有包含androidxx關鍵字,則修改請求連結為http://www.androidxx.cn),程式碼如下:
-
Interceptor appInterceptor = new Interceptor() {
-
@Override
-
public Response intercept(Chain chain) throws IOException {
-
Request request = chain.request();
-
HttpUrl url = request.url();
-
String s = url.url().toString();
-
Response response = null;
-
//如果Url中沒有包含androidxx關鍵字,則修改請求連結為http://www.androidxx.cn
-
if (s.contains(“androidxx”)) {
-
request = request.newBuilder().url(“http://www.androidxx.cn”).build();
-
}
-
response = chain.proceed(request);
-
return response;
-
}
- };
複製程式碼
-
注意
OkHttp的攔截器是在OkHttp2.2之後才可以使用,並且攔截器不能與Retrofit ≤ 1.8和Picasso ≤ 2.4框架同時使用。