環境和項目情況
大部分APP應用都用Retrofit + mvp +Rxjava來實現。其中Retrofit實際上用了Okhttp。有了okhttp自然而然想到了攔截器。說到攔截器,就是對每一個訪問(Request)的攔截,打個比方,就好比請求發出去之前,先讓我過濾(加工)一下,比如Header里面我統一處理一下啥的(比如每個請求都加個Token啥的)。
Retrofit 和okhttp攔截器功能強大,能上天入地,本文僅做簡單解釋,並且此文也相當處級和入門,還望各位多多指教。本文簡單和大家一起學學習一下Okhttp攔截器。
實際mvp 請求場景解釋
每個app中都有大量的api(訪問服務器接口),從登陸獲取Token,到接下來所有的api請求可能都需在header中添加Token放入請求頭,來標識客戶端身份。
如下:
模擬代碼(實際業務場景的ApiService代碼)
public interface APIService {
@Multipart
@POST("auth/oauth/token")
Observable<TokenResponse> login(@Header("Authorization") String authorization,
@Part("grant_type") RequestBody grant_type,
@Part("username") RequestBody username,
@Part("password") RequestBody password);
@POST("/app/user/update")
Observable<UpdateUserResponse> updateUser(@Header("access_token") String accesToken,
@Body RequestBody registIdRequestBody);
@GET("/app/user/getUsers")
Observable<JsonObject> getUserInfo(@Header("access_token") String accesToken);
若幾十個 api接口都需要添加Token呢?這里就需要攔截器的概念。一旦獲取到Token就自動添加到請求頭里,這樣以后幾十個接口不需要在手動,或者代碼Header里添加Token了!
攔截器隆重登場
/*
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Author : lixiaodaoaaa
Date : 2018/9/4
Time : 17:45
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
*/
public class TokenHeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException{
String token = MainDataManager.getInstance().getToken();
if (StringUtils.isEmpty(token)) {
Request originalRequest = chain.request();
return chain.proceed(originalRequest);
}else {
Request originalRequest = chain.request();
Request updateRequest = originalRequest.newBuilder().header("access_token", token).build();
return chain.proceed(updateRequest);
}
}
}
Token 一般我存在本地或者內存中,通過判斷有Token就代表登錄過,沒有Token就表示沒有登錄過,有Token就將它存在了本地,這個攔截器判斷有Token自動往請求頭中增加Token. header("access_token",token)
將攔截器設置給OKhttpClient.
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").serializeNulls().create();
if (okHttpClient == null) {
okHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(new HttpCacheInterceptor())
.addNetworkInterceptor(new TokenHeaderInterceptor())
.build();
}
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build();
apiService = retrofit.create(APIService.class);
關鍵點
.addNetworkInterceptor(new TokenHeaderInterceptor())
networkInterceptors 是個list,也就是說 okhttpClicent支持多個攔截器 (也夠強大 )
自動刷新Token
有機會我再詳細展開講。這節簡單入門的分享到此結束。感謝閱讀。