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

首頁 > 系統 > Android > 正文

Android的OkHttp包中的HTTP攔截器Interceptor用法示例

2019-12-12 06:01:36
字體:
來源:轉載
供稿:網友

OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名稱「攔截器」一樣,攔截你的 Request 做一些你想做的事情再送出去。例如:
1.自動加上使用者目前使用的語言送出去取得對應語言的回傳內容。
2.將 Request 計算出這個 Request 的 sigunature 再附加上送出去。
在 okHttp 中分成 Application Interceptor 和 Network Interceptor 兩種。 Application Interceptor 是會可以被 cache 起來的。如官網的圖片: 

2016713112153384.png (1200×1100)

攔截器是 OkHttp 提供的對 HTTP 請求和響應進行統一處理的強大機制。攔截器在實現和使用上類似于 Servlet 規范中的過濾器。多個攔截器可以鏈接起來,形成一個鏈條。攔截器會按照在鏈條上的順序依次執行。 攔截器在執行時,可以先對請求的 Request 對象進行修改;再得到響應的 Response 對象之后,可以進行修改之后再返回。
Interceptor 接口只包含一個方法 intercept,其參數是 Chain 對象。Chain 對象表示的是當前的攔截器鏈條。通過 Chain 的 request 方法可以獲取到當前的 Request 對象。在使用完 Request 對象之后,通過 Chain 對象的 proceed 方法來繼續攔截器鏈條的執行。當執行完成之后,可以對得到的 Response 對象進行額外的處理。
記錄請求和響應信息的攔截器:

public class LoggingInterceptor implements Interceptor {public Response intercept(Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); System.out.println(String.format("發送請求: [%s] %s%n%s",   request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); System.out.println(String.format("接收響應: [%s] %.1fms%n%s",   response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response;}}

OkHttp 中的攔截器分成應用和網絡攔截器兩種。應用攔截器對于每個 HTTP 響應都只會調用一次,可以通過不調用 Chain.proceed 方法來終止請求,也可以通過多次調用 Chain.proceed 方法來進行重試。網絡攔截器對于調用執行中的自動重定向和重試所產生的響應也會被調用,而如果響應來自緩存,則不會被調用。
添加應用和網絡攔截器

client.interceptors().add(new LoggingInterceptor()); //添加應用攔截器client.networkInterceptors().add(new LoggingInterceptor()); //添加網絡攔截器

要做計算 Request 的 sigunature ,則使用方式如下:

public class ApiClient { Interceptor signedRequestInterceptor = new Interceptor() {  @Override  public Response intercept(Chain chain) throws IOException {   Response response = null;   try {    Request originalRequest = chain.request();    Request signedRequest = SignRequestUtil.signRequest(originalRequest);    response = chain.proceed(signedRequest);   } catch (NoSuchAlgorithmException | InvalidKeyException e) {     e.printStackTrace();   }   return response;  } }; OkHttpClient client = new OkHttpClient(); client.networkInterceptors().add(signedRequestInterceptor);}public class SignRequestUtil { public static Request signRequest(Request originalRequest) {  Request.Builder requestBuilder = originalRequest.newBuilder();  // 在這做所有你需要做的事情,重新產生一個 Request 送出去。  return requestBuilder   .headers(getSignedHeaders(originalRequest))   .build(); }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滁州市| 嵊州市| 崇仁县| 弥勒县| 荥经县| 缙云县| 兰西县| 阜宁县| 田东县| 广丰县| 迁安市| 巴林左旗| 柯坪县| 云梦县| 抚顺市| 北流市| 锡林郭勒盟| 绿春县| 贡嘎县| 高邑县| 克东县| 石首市| 萨嘎县| 临城县| 大化| 曲水县| 永善县| 镇巴县| 色达县| 虎林市| 农安县| 集安市| 江永县| 游戏| 金寨县| 庄浪县| 柯坪县| 南岸区| 康马县| 潢川县| 宜黄县|