1. 程式人生 > >OKHTTP攔截器的簡單使用

OKHTTP攔截器的簡單使用

0:
工作中遇到使用攔截器的問題,寫這篇文章以作記錄。

1:
OkHttp 內部是使用攔截器來完成請求和響應的,利用的是責任鏈設計模式,所以可以說,攔截器是 OkHttp 的精髓所在。

2:
假設現在後臺要求我們在請求 API 介面時,都在每一個介面的請求頭上新增對應的 token 。使用 Retrofit 比較多的同學肯定會條件反射出以下程式碼:

@FormUrlEncoded
@POST("/mobile/login.htm")
Call<ResponseBody> login(@Header("token") String token, @Field("mobile"
)
String phoneNumber, @Field("smsCode") String smsCode)
;

這樣的寫法自然可以,無非就是每次呼叫 login API 介面時都把 token 傳進去而已。但是需要注意的是,假如現在有十多個 API 介面,每一個都需要傳入 token ,難道我們去重複一遍又一遍嗎?

相信有良知的程式設計師都會拒絕,因為這會導致程式碼的冗餘。

3:
那麼有沒有好的辦法可以一勞永逸呢?答案是肯定的,那就要用到攔截器了。

程式碼很簡單:

public class TokenHeaderInterceptor implements Interceptor
{
@Override public Response intercept(Chain chain) throws IOException { // get token String token = AppService.getToken(); Request originalRequest = chain.request(); // get new request, add request header Request updateRequest = originalRequest.newBuilder() .header("token"
, token) .build(); return chain.proceed(updateRequest); } }

我們先攔截得到 originalRequest ,然後利用 originalRequest 生成新的 updateRequest ,再交給 chain 處理進行下一環。

最後,在 OkHttpClient 中使用:

OkHttpClient client = new OkHttpClient.Builder()
                .addNetworkInterceptor(new TokenHeaderInterceptor())
                .build();

Retrofit retrofit = new Retrofit.Builder().baseUrl(BuildConfig.BASE_URL)
                .client(client).addConverterFactory(GsonConverterFactory.create()).build();

這裡只是最簡單的用法還有別的用法,自行研究吧