大部分APP應用都用Retrofit + mvp +Rxjava來實現。其中Retrofit實際上用了Okhttp。有了okhttp天然而然想到了攔截器。說到攔截器,就是對每個訪問(Request)的攔截,打個比方,就比如請求發出去以前,先讓我過濾(加工)一下,好比Header裏面我統一處理一下啥的(好比每一個請求都加個Token啥的)。
java
Retrofit 和okhttp攔截器功能強大,能上天入地,本文僅作簡單解釋,而且此文也至關處級和入門,還望各位多多指教。本文簡單和你們一塊兒學學習一下Okhttp攔截器。api
每一個app中都有大量的api(訪問服務器接口),從登錄獲取Token,到接下來全部的api請求可能都需在header中添加Token放入請求頭,來標識客戶端身份。
以下:服務器
模擬代碼(實際業務場景的ApiService代碼)app
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了!ide
/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 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)學習
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支持多個攔截器 (也夠強大 )ui
有機會我再詳細展開講。這節簡單入門的分享到此結束。感謝閱讀。code