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

攔截器是 OkHttp 提供的對(duì) HTTP 請(qǐng)求和響應(yīng)進(jìn)行統(tǒng)一處理的強(qiáng)大機(jī)制。攔截器在實(shí)現(xiàn)和使用上類似于 Servlet 規(guī)范中的過濾器。多個(gè)攔截器可以鏈接起來,形成一個(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)前的攔截器鏈條。通過 Chain 的 request 方法可以獲取到當(dāng)前的 Request 對(duì)象。在使用完 Request 對(duì)象之后,通過 Chain 對(duì)象的 proceed 方法來繼續(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)用一次,可以通過不調(diào)用 Chain.proceed 方法來終止請(qǐng)求,也可以通過多次調(diào)用 Chain.proceed 方法來進(jìn)行重試。網(wǎng)絡(luò)攔截器對(duì)于調(diào)用執(zhí)行中的自動(dòng)重定向和重試所產(chǎn)生的響應(yīng)也會(huì)被調(diào)用,而如果響應(yīng)來自緩存,則不會(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)懸浮對(duì)話框代碼
這篇文章主要介紹了Android實(shí)現(xiàn)懸浮對(duì)話框代碼的相關(guān)資料,需要的朋友可以參考下2016-03-03
HandlerThread的使用場(chǎng)景和用法詳解
這篇文章主要介紹了HandlerThread的使用場(chǎng)景和用法詳解,HandlerThread是Android中的一個(gè)線程類,它是Thread的子類,并且內(nèi)部封裝了Looper和Handler,提供了更方便的消息處理和線程操作,需要的朋友可以參考下2023-07-07
淺談Android中關(guān)于靜態(tài)變量(static)的使用問題
本文主要介紹了Android中關(guān)于靜態(tài)變量(static)的使用問題,具有一定的參考作用,下面跟著小編一起來看下吧2017-01-01
Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié)
這篇文章主要介紹了Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié),幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-04-04
Android Recyclerview實(shí)現(xiàn)上拉加載更多功能
在項(xiàng)目中使用列表的下拉刷新和上拉加載更多是很常見的功能。下文給大家?guī)砹薃ndroid Recyclerview上拉加載更多功能,需要的朋友參考下吧2017-05-05
Android 實(shí)現(xiàn)截屏功能的實(shí)例
這篇文章主要介紹了Android 實(shí)現(xiàn)截屏功能的實(shí)例的相關(guān)資料,這里實(shí)現(xiàn)截屏的實(shí)例在代碼中注釋非常清楚,希望能幫助到大家,需要的朋友可以參考下2017-08-08

