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

时间:2016-02-01 13:56:10

标签: android retrofit okhttp cookiemanager

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

我遇到以下错误:

  

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

然后我提出要求:

示例:

1)登录

 @POST("/login")
 Call<User> login();

2)一些要求:

@GET("/request")
Call<PojoPojo> getPojo();

我收到太多后续请求时出现此错误:21。

请帮忙。

5 个答案:

答案 0 :(得分:7)

杰克沃顿写道:

  

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

     

您需要咨询服务器团队或端点文档   确保将正确的数据直接传递给端点   想打电话。 Retrofit没有采取行动。

剩下的线程就在那里: https://github.com/square/retrofit/issues/1561

答案 1 :(得分:2)

对我而言,问题是:请求网址以"/"开头 将网址@GET("/request")替换为@GET("request")

  • api的基本网址也应以"/"
  • 结尾
  • 如果使用Authorization标头检查是否需要将值设置为"Bearer " + token

使用改造2.4.0版本:

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.4.0</version>
</dependency>

答案 2 :(得分:1)

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

new OkHttpClient.Builder() .followRedirects(FALSE) .followSslRedirects(FALSE)

很高兴了解okhttp3.internal.http.RetryAndFollowUpInterceptor类源代码。

我正在使用OkHttp的版本 3.12.0

答案 3 :(得分:1)

这也发生在令牌的标头的密钥已经存在,而不是用新的令牌替换它的情况下,如下所示:

response.request.newBuilder()
                .header("Authorization", token)
                .build()

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

response.request.newBuilder()
                .addHeader("Authorization", token)
                .build()

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

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

response.request.newBuilder()
                    .header("Authorization", token)
                    .build()

答案 4 :(得分:0)

<块引用>

就我而言,这是因为标题中的 cookie 已过期。 很明显,我们需要在服务器端代码中修复此问题,但如果我们无法更改服务器端代码,我们可以使用此解决方法。

以下是对我有用的解决方法

catch (ProtocolException e) {
        
        Timber.w(e);
        if (e.getMessage().contains("Too many follow-up requests")) {
            doSynchronousLogin();

            Request.Builder builder = chain.request().newBuilder();
            builder.addHeader("Cookie", dataManager.getCookie());
            Timber.w("Request processed after auto-login");
            return chain.proceed(builder.build());
        }
    }

以上代码是在改造拦截器中添加的