使用retrofit2時,接口需要登錄後請求頭裏放token解決方案

需求:

沒有登陸時接口照常使用,登陸後請求數據需要在請求頭裏帶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();

 

完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章