24

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

我有以下错误:

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。

请帮忙。

4

5 回答 5

20

杰克沃顿写道:

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

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

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

于 2018-03-14T14:27:42.217 回答
4

对我来说,问题是:请求 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>
于 2018-04-25T07:23:04.730 回答
2

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

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

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

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

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

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

response.request.newBuilder()
                    .header("Authorization", token)
                    .build()
于 2020-08-20T19:33:59.927 回答
2

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

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

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

我使用的是OkHttp 3.12.0 版。

于 2019-12-23T08:32:45.480 回答
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());
        }
    }

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

于 2021-06-29T06:10:37.353 回答