2017-04-17 1 views
0

Dans toutes les demandes dans l'application, si une erreur se produit , vous devez effectuer une certaine action. Je ne veux pas gérer cette action manuellement dans chaque requête.Action avec des erreurs 401 dans toutes les demandes

Est-il possible de résoudre ce moment au niveau OkHttp de sorte qu'il s'applique immédiatement à toutes les demandes à la fois?

Rénovation et classe OkHttp:

public class RestApi { 

    public final User user; 
    private PreferenceHelper preferenceHelper; 

    public static final String TAG = "RestApi: "; 

    @Inject 
    public RestApi(PreferenceHelper preferenceHelper) { 
     this.preferenceHelper = preferenceHelper; 

     TokenAppendingHeaderInterceptor tokenInterceptor = new TokenAppendingHeaderInterceptor(); 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(interceptor) 
       .addInterceptor(tokenInterceptor) 
       .connectTimeout(10, TimeUnit.SECONDS) 
       .writeTimeout(10, TimeUnit.SECONDS) 
       .readTimeout(30, TimeUnit.SECONDS) 
       .build(); 


     Retrofit retrofit = new Retrofit.Builder().baseUrl(Const.Url.API) 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .build(); 
     user = retrofit.create(User.class); 
    } 






    public class TokenAppendingHeaderInterceptor implements Interceptor { 

     @Override 
     public okhttp3.Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      String token = preferenceHelper.getToken(); 
      Request newRequest = request.newBuilder() 
        .addHeader(Const.Url.COOKIE, token) 
        .build(); 
      return chain.proceed(newRequest); 
     } 
    } 


    public String getCookiesFromResponse(Response response) { 
     String cookies = ""; 
     List<String> listCookies; 
     try { 
      listCookies = response.headers().toMultimap().get("Set-COOKIE"); 
      cookies = CookieHelper.getStringCookies(listCookies); 
     } catch (NullPointerException e) { 
      Log.d(TAG, "getCookiesFromResponse: BITRIX can't send cookies"); 
     } finally { 
      return cookies; 
     } 
    } 

} 

Répondre

0

Ajouter en-têtes pour l'authentification à la demande Dans votre code TokenAppendingHeaderInterceptor classe dans la méthode Intercept ajouter les hweaders comme celui-ci r

equest.addheader('Content-Type': 'application/json;charset=UTF-8'); 
request.addheaders('Authorizcation', 'Basic '+btoa(username + ':' + password)); 

Je pense qu'il vous aidera