2017-09-25 44 views
0

我正在使用retrofit庫來解析json.But中的數據,現在我需要在我的請求中傳遞令牌。我已經在一個全局類中設置了令牌。現在我想在APIClient中使用該令牌。但是當我傳遞時,它通過null。如何將令牌從java類傳遞到改進APIClient

這是我APIClient

public class APIClient { 
    public static final String BASE_URL = "http://kartpays.bizs/api/v5/"; 
    private static Retrofit retrofit = null; 
    public static final String FOLLOW_URL ="http://kartpays.biz/api/v1/follow/"; 

    public static Retrofit getRetrofitInstance() { 

     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.addInterceptor(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Request originalRequest = chain.request(); 


       Request request = originalRequest.newBuilder() 
         .header("token", **I want to pass token here**) 
         .header("Content-Type", "application/json") 
         .method(originalRequest.method(), originalRequest.body()) 
         .build(); 

       return chain.proceed(request); 
      } 
     }); 
     OkHttpClient client = httpClient.build(); 

     retrofit = new Retrofit.Builder() 
       .baseUrl(FOLLOW_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 

     return retrofit; 
    } 
} 

在這個類我保持令牌

public class LibFile { 
    Context context; 

    public static SharedPreferences settings; 
    private static LibFile instance; 
    public static LibFile getInstance(Context context) { 
     if (instance == null) { 
      instance = new LibFile(context); 
     } 
     return instance; 
    } 

    public LibFile(Context context) { 
     this.context = context; 
     settings = context.getSharedPreferences(AppConstants.PREFS_FILE_NAME_PARAM, 0); 
    } 

    public String getUser_id() { 
     return settings.getString("user_id", ""); 
    } 

    public void setUser_id(String link) { 
     settings.edit().putString("user_id", link).commit(); //get link from here 
    } 

    public String getToken() { 
     return settings.getString("token","");//pass key here 
    } 

    public static void setToken(String userName) { 
     settings.edit().putString("token", userName).commit();//get key from here 
    } 

    public void clearCache() { 
     settings.edit().clear().commit(); 
     settings.edit().remove("link").commit(); 
    } 
} 

請建議我如何令牌動態傳遞。我不能錯過靜態令牌,因爲它改變了提前

+1

,你在呼喚你的方法getRetrofitInstance(「令牌」) – gaurang

+0

如果我的答案是正確的,那麼你也可以給予好評它,你可以通過它。這對其他人也是有用的。謝謝。 – Kuls

回答

0

continuously.Thanks如果您的令牌存儲在SharedPreference然後檢查你的代碼的更改下方,

public static Retrofit getRetrofitInstance(Context mContext) { 

     SharedPreferences settings = mContext.getSharedPreferences(AppConstants.PREFS_FILE_NAME_PARAM, 0); 

     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.addInterceptor(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Request originalRequest = chain.request(); 


       Request request = originalRequest.newBuilder() 
         .header("token", settings.getString("token", "")) 
         .header("Content-Type", "application/json") 
         .method(originalRequest.method(), originalRequest.body()) 
         .build(); 

       return chain.proceed(request); 
      } 
     }); 
     OkHttpClient client = httpClient.build(); 

     retrofit = new Retrofit.Builder() 
       .baseUrl(FOLLOW_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 

     return retrofit; 
    } 
} 
0

更好的解決方案相適應您的代碼會是:

Request request = originalRequest.newBuilder() 
         .header("token", LibFile.getInstance(mContext).getToken()) 
         .header("Content-Type", "application/json") 
         .method(originalRequest.method(), originalRequest.body()) 
         .build(); 

檢查這一行:.header("token", LibFile.getInstance(mContext).getToken())

內搭一個來自LibFile的實例並獲取一個令牌。

0

在您的http請求中,標題鍵應該是「Authorization」而不是「token」。

Request request = originalRequest.newBuilder() 
        .header("Authorization", **I want to pass token here**) 
        .header("Content-Type", "application/json") 
        .method(originalRequest.method(), originalRequest.body()) 
        .build(); 

您可以使用下面的方法放置並從共享首選項獲取令牌。

public static boolean setStringPreference(String key, String value) { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    if (preferences != null && !TextUtils.isEmpty(key)) { 
     SharedPreferences.Editor editor = preferences.edit(); 
     editor.putString(key, value); 
     return editor.commit(); 
    } 
    return false; 
} 

public static String getStringPreference(String key) { 
    String value = null; 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    if (preferences != null) { 
     value = preferences.getString(key, null); 
    } 
    return value; 
}