我正在使用改造来提出请求。
我遇到以下错误:
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。
请帮忙。
答案 0 :(得分:7)
当超过20时,这会被抛出(由OkHttp,而不是Retrofit) 调用端点时重定向。通常这表示重定向 在两个端点之间循环。 Chrome和Firefox也将停止 在此许多重定向后加载请求并使请求失败。
您需要咨询服务器团队或端点文档 确保将正确的数据直接传递给端点 想打电话。 Retrofit没有采取行动。
答案 1 :(得分:2)
对我而言,问题是:请求网址以"/"
开头
将网址@GET("/request")
替换为@GET("request")
"/"
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());
}
}
以上代码是在改造拦截器中添加的