1. 程式人生 > >OkHttp基本使用(五)攔截器

OkHttp基本使用(五)攔截器

本篇介紹OkHttp的攔截器的使用。
首先我們需要了解什麼事攔截器。打個比方,鏢局押著一箱元寶在行走在一個山間小路上,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮乾淨後將其放行。其中山賊相當於攔截器,鏢局相當於一個正在執行任務的網路請求,請求中的引數就是鏢局攜帶的元寶。攔截器可以將網路請求攜帶的引數進行修改驗證,然後放行。這裡面其實設計了AOP程式設計的思想(面向切面程式設計)。
  • 攔截器的作用和好處。
在介紹攔截器的作用和好處之前,我們還是要回到山賊這個角色上,如果讓你做一次山賊,你會在什麼地方埋伏?肯定是在鏢局必經之路上埋伏。也就是說,攔截器就是在所有的網路請求的必經之地上進行攔截。

1、攔截器可以一次性對所有的請求和返回值進行修改。
2、攔截器可以一次性對請求的引數和返回的結果進行編碼,比如統一設定為UTF-8.
3、攔截器可以對所有的請求做統一的日誌記錄,不需要在每個請求開始或者結束的位置都新增一個日誌操作。
4、其他需要對請求和返回進行統一處理的需求....
  • OkHttp中攔截器分類
OkHttp中的攔截器分2個:APP層面的攔截器(Application Interception)、網路請求層面的攔截器(Network Interception)。如下圖:
 
一、Application Interceptor是在請求執行剛開始,還沒有執行OkHttp的核心程式碼前進行攔截,Application攔截器的作用:

1、不需要擔心是否影響OKHttp的請求策略和請求速度。
2、即使是從快取中取資料,也會執行Application攔截器。
3、允許重試,即Chain.proceed()可以執行多次。(當然請不要盲目執行多次,需要加入你的邏輯判斷)
二、Network Interception是在連線網路之前(如圖,看圖一目瞭然)
1、可以修改OkHttp框架自動新增的一些屬性(當然最好不要修改)。
2、可以觀察最終完整的請求引數(也就是最終伺服器接收到的請求資料和熟悉)
  • 例項化一個攔截器
  1. Interceptor appInterceptor = new Interceptor() {
  2.         @Override
  3.         public Response intercept(Chain chain) throws IOException {
  4.             Request request = chain.request();
  5.             //---------請求之前------------
  6.             Response response = chain.proceed(request1);
  7.             //---------請求之後------------
  8.             return response;
  9.         }
  10.     };
複製程式碼
  • 配置攔截器
  1. okHttpClient = new OkHttpClient
  2.                 .Builder()
  3.                 .addInterceptor(appInterceptor)//Application攔截器
  4.                 .addNetworkInterceptor(networkInterceptor)//Network攔截器
  5.                 .build();
複製程式碼 其中通過addInterceptor新增應用攔截器,addNetworkInterceptor新增網路攔截器。
  • 示例程式碼
  1. public class InterceptorActivity extends AppCompatActivity {
  2.     public static final String TAG = "androidxx";
  3.     OkHttpClient okHttpClient;
  4.     /**
  5.      * 應用攔截器
  6.      */
  7.     Interceptor appInterceptor = new Interceptor() {
  8.         @Override
  9.         public Response intercept(Chain chain) throws IOException {
  10.             Request request = chain.request();
  11.             HttpUrl url = request.url();
  12.             String s = url.url().toString();
  13.             //---------請求之前-----
  14.             Log.d(TAG,"app interceptor:begin");
  15.             Response  response = chain.proceed(request);
  16.             Log.d(TAG,"app interceptor:end");
  17.             //---------請求之後------------
  18.             return response;
  19.         }
  20.     };
  21.     /**
  22.      * 網路攔截器
  23.      */
  24.     Interceptor networkInterceptor = new Interceptor() {
  25.         @Override
  26.         public Response intercept(Chain chain) throws IOException {
  27.             Request request = chain.request();
  28.             //---------請求之前-----
  29.             Log.d(TAG,"network interceptor:begin");
  30.             Response  response = chain.proceed(request);
  31.             Log.d(TAG,"network interceptor:end");
  32.             return response;
  33.         }
  34.     };
  35.     @Override
  36.     protected void onCreate(Bundle savedInstanceState) {
  37.         super.onCreate(savedInstanceState);
  38.         setContentView(R.layout.activity_interceptor);
  39.         okHttpClient = new OkHttpClient
  40.                 .Builder()
  41.                 .addInterceptor(appInterceptor)//Application攔截器
  42.                 .addNetworkInterceptor(networkInterceptor)//Network攔截器
  43.                 .build();
  44.     }
  45.     public void click(View view) {
  46.         Request request = new Request.Builder().url("http://www.androidxx.cn").build();
  47.         okHttpClient.newCall(request).enqueue(new Callback() {
  48.             @Override
  49.             public void onFailure(Call call, IOException e) {
  50.                 e.printStackTrace();
  51.             }
  52.             @Override
  53.             public void onResponse(Call call, Response response) throws IOException {
  54.                 Log.d(TAG,"--" + response.networkResponse());
  55.             }
  56.         });
  57.     }
  58. }
複製程式碼 執行結果如下:
 

可以看到,從App Interceptor開始,然後執行Network Interceptor,最後又回到App Interceptor.

  • 建議
如果對攔截器不是很熟的同學,開發過程中,建議使用Application Interception。這樣避免對OkHttp請求策略的破壞。
  • 實際開發中的用途
1、對請求引數進行統一加密處理。
2、攔截不符合規則的URL。
3、對請求或者返回引數設定統一的編碼方式
4、其它...。
比如對URL進行驗證(如果Url中沒有包含androidxx關鍵字,則修改請求連結為http://www.androidxx.cn),程式碼如下:
  1. Interceptor appInterceptor = new Interceptor() {
  2.         @Override
  3.         public Response intercept(Chain chain) throws IOException {
  4.             Request request = chain.request();
  5.             HttpUrl url = request.url();
  6.             String s = url.url().toString();
  7. Response  response = null;
  8.             //如果Url中沒有包含androidxx關鍵字,則修改請求連結為http://www.androidxx.cn
  9.             if (s.contains("androidxx")) {
  10.                 request = request.newBuilder().url("http://www.androidxx.cn").build();
  11.             }
  12.             response = chain.proceed(request);
  13. return response;
  14.         }
  15.     };
複製程式碼
  • 注意
OkHttp的攔截器是在OkHttp2.2之後才可以使用,並且攔截器不能與Retrofit ≤ 1.8和Picasso ≤ 2.4框架同時使用。

相關推薦

OkHttp基本使用攔截

本篇介紹OkHttp的攔截器的使用。首先我們需要了解什麼事攔截器。打個比方,鏢局押著一箱元寶在行走在一個山間小路上,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮乾淨後將其放行。其中山賊相當於攔截器,鏢局相當於一個正在執行任務的網路請求,請求中的引數就是鏢

Spring Boot-- 攔截HandlerInterceptor

上一篇對過濾器的定義做了說明,也比較簡單。過濾器屬於Servlet範疇的API,與Spring 沒什麼關係。 Web開發中,我們除了使用 Filter 來過濾請web求外,還可以使用Spring提供的HandlerInterceptor(攔截器)。HandlerInterce

OkHttp完全解析攔截

攔截器是一種能夠監控,重寫,重試呼叫的強大機制。 呼叫chain.proceed(request)是每個攔截器實現的關鍵部分。這個看似簡單的方法是所有HTTP 工作發生的地方, 在這裡產生一個響應應答請求。 攔截器可以是鏈式的,假設你有一個壓縮攔截器和一個校驗攔截器,那

STM32F407VG 定時

博客 計數 led eba reset gpio onf cpu bsp 一、定時器節本分類和主要特點 1.STM32定時器分類: 1)看門狗定時器 2)SysTick定時器 3)RTC定時器 4)通用定時器 a)通用定時器TIM2~TIM5,

Shiro學習8攔截機制

綁定 local cin 沒有 代碼 authz https 字符串 subject 8.1 攔截器介紹 Shiro使用了與Servlet一樣的Filter接口進行擴展;所以如果對Filter不熟悉可以參考《Servlet3.1規範》http://www.iteye.com

SpringMVC筆記攔截

servlet 執行 ued div throws nbsp ole spring 事務 一、攔截器:Spring MVC也可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義的攔截器必 須實現HandlerInterceptor接口 二、

OpenGL學習 著色渲染以Android為例

back lse setw %d 編譯 clas ddr attr type 一、Android平臺上下文環境的創建及初始化 1. 首先實例化Android上下文環境,即EGL的初始化。 bool EGLCore::init(EGLContext sharedContex

springmvc5攔截

轉移 void dex con value mvc框架 view ret exception 1.什麽是攔截器 是指通過統一的攔截從瀏覽器發送到服務器的請求來完成相應服務增強 2.攔截器的基本原理 可以通過配置過濾器解決亂碼問題 和過濾器非常相似 3.搭建工程 註

Okhttp解析快取的處理

大家好,之前我們講解了Okhttp網路資料請求相關的內容,這一節我們講講資料快取的處理。本節按以下內容講解Okhttp快取相關的內容。 快取的優勢 HTTP的快取機制 Okhttp的快取啟用 Okhttp的讀取快取流程 Okhttp的

SpringMVC攔截

SpringMVC(七)攔截器 當請求來到DispatcherServlet時,它會根據HandlerMapping的機制找到處理器,這樣就返回一個HandlerExecutionChain物件,這個物件包含處理器和攔截器。這裡的攔截器會對處理器進行攔截,這樣通過攔截器就可以增強處理

springmvc基礎:3攔截與檔案上傳

Springmvc與Struts2的區別       springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。       springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或

struts2小小專案 經驗總結2 攔截

如果說一個網站可以直接訪問到需要登入後才能訪問的網頁,這是很失敗的,所以,必須實現這樣一個功能,就是客戶端不可以直接訪問非登入介面的網頁,這個功能可以使用struts2的攔截器來實現,就是如果有使用者賦值拿已經登入的網頁貼上訪問的話,是會跳到登入介面的。 要使用struts2的攔截器,要

Struts25 攔截和檔案上傳

Interceptor 與filter的區別:先過filter再過interceptor 怎麼設定攔截器: 在配置檔案struts-sy.xml的 package裡面配置 <!-- 配置2個攔截器 class指的是攔截器的全類名 --> <

python基礎學習筆記裝飾,高階函式

多程序程式設計import multiprocessing def process1(): return 1 def process2(): return 2 p1=multiprocessing.Process(target=process1) p2=m

Struts2中的Interceptor攔截的執行順序

Interceptor的介面定義沒有什麼特別的地方,除了init和destory方法以外,intercept方法是實現整個攔截器機制的核心方法。而它所依賴的引數ActionInvocation則是我們之前章節中曾經提到過的著名的Action排程者。 Java程式碼 

基於Proteus學習微控制器系列——定時實現電子錶

  專案下載    點選下載1. 電路圖  2. 程式主函式#include<reg51.h> #include<DEFINE.c> #include<KEY.c> #include<DISPLAY.c> void timer_

重學設計模式—— 裝飾、介面卡、門面和代理

Decorator裝飾器模式 裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 java IO 流是裝飾模式一個典型的應用場景。 舉個生活中的例子,飲品店的飲料價格

2020了你還不會Java8新特性?收集比較用法詳解及原始碼剖析

收集器用法詳解與多級分組和分割槽 為什麼在collectors類中定義一個靜態內部類? static class CollectorImpl<T, A, R> implements Collector<T, A, R> 設計上,本身就是一個輔助類,是一個工廠。作用是給開發者提供常見的

Mybatis攔截實現通用mapper及全ORM實現-- springboot+mybatis多資料來源設定

本篇實際上和mybatisext專案並沒有太大關係了,但在實際專案中脫離不開多個數據源,尤其是主從分離,同樣網上一些資料大同小異而且大部分並不能真正解決問題,所以單獨提出來說一下 假設我們就是要解決一個主從分離,資料來源定義在了application.properties中

基本爬蟲架構實現的豆瓣爬蟲: 爬蟲排程

一、實現原理 爬蟲排程器首先要做的是初始化各個模組,然後通過 crawl(start_url) 方法傳入入口 URL,方法內部實現按照執行流程控制各個模組的工作。   二、程式碼如下 1 from UrlManager import UrlManager 2 from HtmlDo