web-dev-qa-db-fra.com

Rénovation - Trop de demandes de suivi: 21

J'utilise retrofit pour faire des demandes.

J'ai l'erreur suivante:

Java.net.ProtocolException: Trop de demandes de suivi: 21

Le code est comme ci-dessous:

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

Et puis je fais des demandes:

exemple:

1) connexion

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

2) une demande:

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

Et je reçois cette erreur trop de demandes de suivi: 21.

Veuillez aider.

19
Marcin Bortel

Jake Wharton a écrit:

Cela est levé (par OkHttp, pas Retrofit) lorsqu'il y a plus de 20 redirections lors de l'appel d'un point de terminaison. Cela indique généralement un cycle de redirection entre deux points de terminaison. Les deux Chrome et Firefox arrêteront également de charger la demande après ce nombre de redirections et échoueront la demande.

Vous devez consulter votre équipe de serveurs ou la documentation du point de terminaison pour vous assurer de transmettre les données correctes directement au point de terminaison que vous souhaitez appeler. Aucune action que Retrofit ne peut entreprendre ici.

Et le reste du fil est là: https://github.com/square/retrofit/issues/1561

9
Marcin Bortel

Pour moi, le problème était: l'URL de la demande commençait par "/".
Remplacez l'url @GET("/request") par @GET("request")

  • aussi l'url de base de l'api doit se terminer par "/"
  • si vous utilisez un en-tête Authorization, vérifiez si vous devez définir la valeur comme "Bearer " + token à la place

en utilisant la version retrofit 2.4.0:

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

Comme solution de contournement, il est possible d'utiliser:

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

Agréable de jeter un oeil à okhttp3.internal.http.RetryAndFollowUpInterceptor code source de la classe.

J'utilise la version 3.12.0 d'OkHttp.

1
Edson Prestes