2017-09-25 2 views
0

J'utilise la bibliothèque retrofit pour analyser les données de json.Mais maintenant je dois passer un jeton dans ma requête. J'ai placé le jeton dans une classe globale. Maintenant, je veux utiliser ce jeton dans APIClient.But quand je le passe, il passe par null.Comment passer un jeton de java class à posteriori APIClient

Ceci est mon 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; 
    } 
} 

Dans cette classe i emmagasinés jeton

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(); 
    } 
} 

S'il vous plaît me suggérer comment passer dynamiquement jeton. Je ne pouvais pas passer jeton statique car il change continuously.Thanks à l'avance

+1

vous pouvez passer où vous appelez votre méthode getRetrofitInstance (« token ») – gaurang

+0

Si ma réponse est juste, alors vous pouvez également upvote il. Ce serait utile pour d'autres aussi. Merci. – Kuls

Répondre

0

Si votre jeton est stocké dans SharedPreference puis vérifier ci-dessous les modifications de votre code,

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

Une meilleure solution convenant à votre code renverrait être:

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

Cocher cette ligne: .header("token", LibFile.getInstance(mContext).getToken())

qui prennent une instance de LibFile et obtient un jeton.

0

Dans votre requête http, la clé d'en-tête doit être "Authorization" au lieu de "token".

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

Vous pouvez utiliser les méthodes ci-dessous pour placer et obtenir un jeton à partir de préférences partagées.

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; 
}