需求:
沒有登陸時接口照常使用,登陸後請求數據需要在請求頭裏帶token過去。
問題:
這個header的聲明方式有幾種,常見的是在創建單例接口類時就給聲明瞭header,而這個單例在第一次請求數據的時候就創建了,那時候如果沒有登陸,那登陸後依然是用的同一個header,就帶不過去這個token。另一種就是在聲明接口的時候添加@Header()註解,但是這樣的話需要每個接口上面都寫這個,就比較麻煩。
解決思路:
用OKHttp做請求攔截,如果沒有登陸(SharedPreferences中沒有獲取到token)就用原來的請求,如果登陸了,就添加一個請求頭,請求頭裏面添加一個key-value給token。
具體代碼實現:
1、自定義攔截器:
//在請求頭裏添加token的攔截器處理
public class TokenHeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
String token = SpUtils.getToken(); //SpUtils是SharedPreferences的工具類,自行實現
if (token.isEmpty()) {
Request originalRequest = chain.request();
return chain.proceed(originalRequest);
}else {
Request originalRequest = chain.request();
//key的話以後臺給的爲準,我這邊是叫token
Request updateRequest = originalRequest.newBuilder().header("token", token).build();
return chain.proceed(updateRequest);
}
}
}
2、給okhttp添加攔截器:
private OkHttpClient.Builder getClient(){
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(15, TimeUnit.SECONDS);
httpClientBuilder.addNetworkInterceptor(new TokenHeaderInterceptor());
return httpClientBuilder;
}
3、Retrofit創建的時候添加這個OkHttpClient:
Retrofit build = new Retrofit.Builder()
.baseUrl(BaseConstant.API_URL)
.client(getClient().build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();