一、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框架同時使用。新聞熱點
疑難解答