1

我有实现 Authenticator 接口的 TokenAuthenticator 类。

TokenAuthenticator 类如下所示:

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

而创建服务的方法是:

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

我得到这个例外:

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

我在改造和okHttp3中使用,我需要做什么???

4

1 回答 1

2

好的,我得到了问题(需要将 Bearer 添加到标头请求):

需要改变:

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

到这段代码:

return response.request().newBuilder()
                    .header("Authorization", "Bearer " +  refreshTokenResponse.accessToken)
                    .build();
于 2017-05-23T15:03:00.817 回答