Android的OkHttp包中的HTTP攔截器Interceptor用法示例
OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名稱「攔截器」一樣,攔截你的 Request 做一些你想做的事情再送出去。例如:
1.自動(dòng)加上使用者目前使用的語(yǔ)言送出去取得對(duì)應(yīng)語(yǔ)言的回傳內(nèi)容。
2.將 Request 計(jì)算出這個(gè) Request 的 sigunature 再附加上送出去。
在 okHttp 中分成 Application Interceptor 和 Network Interceptor 兩種。 Application Interceptor 是會(huì)可以被 cache 起來(lái)的。如官網(wǎng)的圖片:
攔截器是 OkHttp 提供的對(duì) HTTP 請(qǐng)求和響應(yīng)進(jìn)行統(tǒng)一處理的強(qiáng)大機(jī)制。攔截器在實(shí)現(xiàn)和使用上類似于 Servlet 規(guī)范中的過(guò)濾器。多個(gè)攔截器可以鏈接起來(lái),形成一個(gè)鏈條。攔截器會(huì)按照在鏈條上的順序依次執(zhí)行。 攔截器在執(zhí)行時(shí),可以先對(duì)請(qǐng)求的 Request 對(duì)象進(jìn)行修改;再得到響應(yīng)的 Response 對(duì)象之后,可以進(jìn)行修改之后再返回。
Interceptor 接口只包含一個(gè)方法 intercept,其參數(shù)是 Chain 對(duì)象。Chain 對(duì)象表示的是當(dāng)前的攔截器鏈條。通過(guò) Chain 的 request 方法可以獲取到當(dāng)前的 Request 對(duì)象。在使用完 Request 對(duì)象之后,通過(guò) Chain 對(duì)象的 proceed 方法來(lái)繼續(xù)攔截器鏈條的執(zhí)行。當(dāng)執(zhí)行完成之后,可以對(duì)得到的 Response 對(duì)象進(jìn)行額外的處理。
記錄請(qǐng)求和響應(yīng)信息的攔截器:
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("發(fā)送請(qǐng)求: [%s] %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); System.out.println(String.format("接收響應(yīng): [%s] %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response; } }
OkHttp 中的攔截器分成應(yīng)用和網(wǎng)絡(luò)攔截器兩種。應(yīng)用攔截器對(duì)于每個(gè) HTTP 響應(yīng)都只會(huì)調(diào)用一次,可以通過(guò)不調(diào)用 Chain.proceed 方法來(lái)終止請(qǐng)求,也可以通過(guò)多次調(diào)用 Chain.proceed 方法來(lái)進(jìn)行重試。網(wǎng)絡(luò)攔截器對(duì)于調(diào)用執(zhí)行中的自動(dòng)重定向和重試所產(chǎn)生的響應(yīng)也會(huì)被調(diào)用,而如果響應(yīng)來(lái)自緩存,則不會(huì)被調(diào)用。
添加應(yīng)用和網(wǎng)絡(luò)攔截器
client.interceptors().add(new LoggingInterceptor()); //添加應(yīng)用攔截器 client.networkInterceptors().add(new LoggingInterceptor()); //添加網(wǎng)絡(luò)攔截器
要做計(jì)算 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(); // 在這做所有你需要做的事情,重新產(chǎn)生一個(gè) Request 送出去。 return requestBuilder .headers(getSignedHeaders(originalRequest)) .build(); } }
相關(guān)文章
Android 實(shí)現(xiàn)文件夾排序功能的實(shí)例代碼
這篇文章主要介紹了Android 實(shí)現(xiàn)文件夾排序功能的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-09-09Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級(jí)、二級(jí)進(jìn)度條顏色)
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義ProgressBar樣式功能,涉及針對(duì)背景色及一級(jí)、二級(jí)進(jìn)度條顏色的操作技巧,需要的朋友可以參考下2017-01-01Android利用Sensor(傳感器)實(shí)現(xiàn)水平儀功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor傳感器實(shí)現(xiàn)水平儀功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Flutter實(shí)現(xiàn)笑嘻嘻的動(dòng)態(tài)表情的示例代碼
這篇文章主要為大家介紹了如何利用Flutter實(shí)現(xiàn)笑嘻嘻的動(dòng)態(tài)表情,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Flutter有一定幫助,感興趣的可以了解一下2022-04-04Android 點(diǎn)擊屏幕空白處收起輸入法軟鍵盤(pán)(手動(dòng)打開(kāi))
很多時(shí)候,我們?cè)谑褂脩?yīng)用時(shí),會(huì)出現(xiàn)輸入法軟鍵盤(pán)彈出的問(wèn)題,通常情況下,我們默認(rèn)會(huì)使用戶點(diǎn)擊返回鍵或者下一步對(duì)軟鍵盤(pán)進(jìn)行隱藏。為了更好的體驗(yàn),我們可以實(shí)現(xiàn)當(dāng)用戶使用完畢軟鍵盤(pán)時(shí)。點(diǎn)擊屏幕空白即可實(shí)現(xiàn)收起輸入法軟鍵盤(pán)2016-12-12Android編程開(kāi)發(fā)錄音和播放錄音簡(jiǎn)單示例
這篇文章主要介紹了Android編程開(kāi)發(fā)錄音和播放錄音的方法,結(jié)合實(shí)例形式分析了Android多媒體開(kāi)發(fā)中音頻操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08Android開(kāi)發(fā)使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)編程詳解【附源碼下載】
這篇文章主要介紹了Android開(kāi)發(fā)使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)編程的方法,結(jié)合實(shí)例形式分析了Android基于HttpURLConnection實(shí)現(xiàn)顯示圖片與文本功能,涉及Android布局、文本解析、數(shù)據(jù)傳輸、權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01詳解Android中fragment和viewpager的那點(diǎn)事兒
本文主要對(duì)Android中fragment和viewpager進(jìn)行詳細(xì)介紹,具有一定的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12Android中控件GridView實(shí)現(xiàn)設(shè)置行列分割線的方法示例
這篇文章主要介紹了利用Android中控件GridView實(shí)現(xiàn)設(shè)置行列分割線的方法,文中給出了詳細(xì)的介紹與示例代碼,相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-01-01