改造 - 太多的后续请求:21

Mar*_*tel 16 android cookiemanager retrofit okhttp

我正在使用改造来提出请求.

我有以下错误:

java.net.ProtocolException:后续请求太多:21

代码如下:

private OkHttpClient httpClient;
private CookieManager cookieManager;

public <S> S createCookieService(Class<S> serviceClass) {
    httpClient.interceptors().clear();
    httpClient.setCookieHandler(cookieManager);
    Retrofit.Builder builder = new Retrofit
            .Builder()
            .client(httpClient)
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.client(httpClient).build();

    return retrofit.create(serviceClass);
}
Run Code Online (Sandbox Code Playgroud)

然后我提出要求:

例:

1)登录

 @POST("/login")
 Call<User> login();
Run Code Online (Sandbox Code Playgroud)

2)一些要求:

@GET("/request")
Call<PojoPojo> getPojo();
Run Code Online (Sandbox Code Playgroud)

我收到这个错误的后续请求太多:21.

请帮忙.

Mar*_*tel 10

杰克沃顿写道:

当调用端点时有超过20个重定向时,这会被抛出(通过OkHttp,而不是Retrofit).通常这表示两个端点之间的重定向循环.在此重定向后,Chrome和Firefox也将停止加载请求,并使请求失败.

您需要咨询服务器团队或端点文档,以确保将正确的数据直接传递到要调用的端点.Retrofit没有采取任何行动.

其余的线程在那里:https: //github.com/square/retrofit/issues/1561


小智 7

当令牌的标头密钥已经存在并且没有用新令牌替换它时,也会发生这种情况,如下所示:

response.request.newBuilder()
                .header("Authorization", token)
                .build()
Run Code Online (Sandbox Code Playgroud)

您添加新的令牌(单个键可以在标头中包含多个值),很多问题中常见的是像这样添加令牌:

response.request.newBuilder()
                .addHeader("Authorization", token)
                .build()
Run Code Online (Sandbox Code Playgroud)

这将导致请求再次失败(401),并且您将陷入循环。

TL;DR:设置新令牌的正确方法是:

response.request.newBuilder()
                    .header("Authorization", token)
                    .build()
Run Code Online (Sandbox Code Playgroud)


小智 5

作为解决方法,可以使用:

new OkHttpClient.Builder()
    .followRedirects(false)
    .followSslRedirects(false)
Run Code Online (Sandbox Code Playgroud)

很高兴看一下okhttp3.internal.http.RetryAndFollowUpInterceptor类源代码。

我使用的是OkHttp 3.12.0版本。