2017-05-23 2 views
1

J'ai une classe TokenAuthenticator qui implémente l'interface Authenticator.okhttp3 donne une erreur d'exception de protocole - Trop de demandes de suivi: 21

TokenAuthenticator look classe comme ceci:

import java.io.IOException; 

import okhttp3.Authenticator; 
import okhttp3.Request; 
import okhttp3.Response; 
import okhttp3.Route; 
import retrofit2.Call; 

public class TokenAuthenticator implements Authenticator{ 
    private String refreshTokenString; 
    private AuthenticationServiceApi serviceApi; 


    public TokenAuthenticator(ServiceGenerator serviceGenerator, String refreshTokenString) { 
     this.refreshTokenString = refreshTokenString; 
     serviceApi = (AuthenticationServiceApi) serviceGenerator.createService(AuthenticationServiceApi.class); 
    } 

    @Override 
    public Request authenticate(Route route, Response response) throws IOException { 
     RefreshToken refreshToken = new RefreshToken(refreshTokenString); 
     Call<RefreshTokenResponse> refreshTokenCall = serviceApi.refreshTokenSync(Constants.CONTENT_TYPE,refreshToken); 
     RefreshTokenResponse refreshTokenResponse = refreshTokenCall.execute().body(); 
     if(refreshTokenResponse != null) { 
      return response.request().newBuilder() 
        .header("Authorization", refreshTokenResponse.accessToken) 
        .build(); 
     } 
     return null; 
    } 
} 

Et créer méthode de service est:

public <S> S createService(Class<S> serviceClass, AuthenticationProvider provider) { 
     System.out.println("createService"); 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder(); 
     if (provider != null) { 
      okHttpClient.addInterceptor(chain -> { 
       Request original = chain.request(); 
       Request.Builder request = original.newBuilder(); 

       if (provider.accessToken() != null && !provider.accessToken().isEmpty()) { 
        request.addHeader("Authorization", provider.accessToken()); 
        System.out.println("Authorization: " + provider.accessToken()); 
       } 
       return chain.proceed(request.build()); 
      }); 
      TokenAuthenticator tokenAuthenticator = new TokenAuthenticator(this, provider.getRefreshToken()); 
      okHttpClient.authenticator(tokenAuthenticator); 
     } 
     okHttpClient.addInterceptor(interceptor); 
     Retrofit.Builder reBuilder = createRetrofit(okHttpClient.build()); 
     Retrofit retrofit = reBuilder.build(); 
     return retrofit.create(serviceClass); 
} 

Je reçois cette exception:

HTTP FAILED: java.net.ProtocolException: Too many follow-up requests: 21 

Je suis habitué à la modernisation et okHttp3 , Ce que je dois faire???

+0

https: // GitHub. com/square/retrofit/problèmes/1561 –

Répondre

1

Ok j'obtenir le problème (le besoin d'ajouter à-tête Bearer demande):

Besoin de changer:

return response.request().newBuilder() 
        .header("Authorization", refreshTokenResponse.accessToken) 
        .build(); 

à ce code:

return response.request().newBuilder() 
        .header("Authorization", "Bearer " + refreshTokenResponse.accessToken) 
        .build();