android - okhttp3 给出协议(protocol)异常错误 - 后续请求过多 : 21

标签 android retrofit retrofit2 okhttp protocolexception

我有实现 Authenticator 接口(interface)的 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 

我用的是retrofit和okHttp3,我需要做什么???

最佳答案

好的,我明白了(需要将 Bearer 添加到 header 请求):

需要改变:

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

此代码:

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

关于android - okhttp3 给出协议(protocol)异常错误 - 后续请求过多 : 21,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129950/

相关文章:

android - 如何通过 GSON/Retrofit 获取值?

android - Kotlin型干扰失败

android - P2P通信/LLCP NFC读写器-NFC手机

Android 从 Activity 中解锁屏幕并打开相机

android - Retrofit 和 RxJava,避免回调 hell

php - 在 Android 中将 Retrofit 发布到 Rest 服务器

java - 如何使用 Retrofit 和 GSON 解析 [] 包围的 JSON 对象列表?

android以编程方式获取按钮背景imageName

android - Flutter/App开发初学者求智慧,大方向

android - Retrofit Android 基础简单问题