【问题标题】:Retrofit - Too many follow-up requests: 21改造 - 太多后续请求:21
【发布时间】:2016-05-10 00:14:51
【问题描述】:

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

我有以下错误:

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。

请帮忙。

【问题讨论】:

  • 你找到解决办法了吗?
  • 是的,我做到了,但来自 facebook (Martijn Pieters) 的一些非常重要的家伙决定删除链接以回答。祝你好运。
  • 你为什么不把答案放在这里?这不是 SO 的重点吗?
  • 这可能是由于您的服务器端出错

标签: android retrofit okhttp cookiemanager


【解决方案1】:

杰克·沃顿写道:

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

您需要咨询您的服务器团队或端点文档以 确保您将正确的数据直接传递到您的端点 想打电话。 Retrofit 无需在此处执行任何操作。

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

【讨论】:

【解决方案2】:

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

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

使用改造 2.4.0 版本:

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

【讨论】:

    【解决方案3】:

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

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

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

    我使用的是 OkHttp 的 3.12.0 版本。

    【讨论】:

      【解决方案4】:

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

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

      你添加新的token(一个key可以在headers中有很多值),很多问题的共同点是像这样添加token:

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

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

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

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

      【讨论】:

        【解决方案5】:

        在我的情况下,这是因为标头中的 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());
                }
            }
        

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

        【讨论】:

          猜你喜欢
          • 2022-01-21
          • 2017-03-29
          • 1970-01-01
          • 2018-07-13
          • 1970-01-01
          • 2018-02-16
          • 1970-01-01
          • 1970-01-01
          • 2018-04-12
          相关资源
          最近更新 更多