国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OkHttp基本使用(五)攔截器

2019-11-06 09:44:40
字體:
來源:轉載
供稿:網友
本篇介紹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、可以觀察最終完整的請求參數(也就是最終服務器接收到的請求數據和熟悉)實例化一個攔截器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框架同時使用。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清新县| 敦化市| 伊金霍洛旗| 莱阳市| 天柱县| 东丰县| 周至县| 隆尧县| 江西省| 敦化市| 社旗县| 织金县| 乐至县| 射洪县| 徐闻县| 读书| 北票市| 托克逊县| 班玛县| 兴安县| 锦州市| 南召县| 深圳市| 锡林郭勒盟| 呼伦贝尔市| 会宁县| 北宁市| 甘谷县| 石门县| 西林县| 本溪市| 古交市| 镇原县| 佛坪县| 米脂县| 松桃| 无锡市| 资兴市| 克东县| 祁门县| 枞阳县|