OKHTTP攔截器的簡單使用
阿新 • • 發佈:2019-02-19
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();
這裡只是最簡單的用法還有別的用法,自行研究吧