Éviter Circulaire de Redirection à l'aide de HttpClient 4.1.1
Comment puis-je éviter la circulaire de redirection à l'aide de HttpClient 4.1.1. Comme je l'obtiens l'erreur comme ceci:-
executing requestGET http://home.somehost.com/Mynet/pages/cHome.xhtml HTTP/1.1
org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at edu.uci.ics.crawler4j.url.WebURL.setURL(WebURL.java:122)
at edu.uci.ics.crawler4j.crawler.CrawlController.addSeed(CrawlController.java:207)
at edu.uci.ics.crawler4j.example.advanced.Controller.main(Controller.java:31)
Caused by: org.apache.http.client.CircularRedirectException: Circular redirect to 'http://home.somehost.com/Mynet/pages/Home.xhtml'
at org.apache.http.impl.client.DefaultRedirectStrategy.getLocationURI(DefaultRedirectStrategy.java:168)
at org.apache.http.impl.client.DefaultRedirectStrategy.getRedirect(DefaultRedirectStrategy.java:193)
at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:1021)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:482)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
C'est mon code...
DefaultHttpClient client = null;
try
{
//Set url
//URI uri = new URI(url.toString());
client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM),
new UsernamePasswordCredentials("test", "test"));
URL url1 = new URL (url);
HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
connection.setFollowRedirects(false);
HttpGet request = new HttpGet(url);
final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
HttpContext context = new BasicHttpContext();
System.out.println("----------------------------------------");
System.out.println("executing request" + request.getRequestLine());
HttpResponse response = client.execute(request, context);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
InputStream content = entity.getContent();
BufferedReader in =
new BufferedReader (new InputStreamReader (content));
String line;
while ((line = in.readLine()) != null) {
//System.out.println(line);
}
} catch(Exception e) {
e.printStackTrace();
}
Êtes-vous sûr que vous pouvez l'éviter ? Si il y a vraiment une circulaire redifection, lancer une exception semble être un moyen raisonnable pour indiquer que.
Merci pour la réponse. je suis arriver la même url de retour pour la circulaire de la redirection. Mais Si je tape l'url dans le navigateur, puis-je obtenir trois de réponse depuis le serveur avec la même url. La première est de 302 Déplacé tempo. la deuxième est de 302 trouvé, le troisième est de 200 ok.. avec la même url...Et je veux récupérer le contenu de cette url.
Merci pour la réponse. je suis arriver la même url de retour pour la circulaire de la redirection. Mais Si je tape l'url dans le navigateur, puis-je obtenir trois de réponse depuis le serveur avec la même url. La première est de 302 Déplacé tempo. la deuxième est de 302 trouvé, le troisième est de 200 ok.. avec la même url...Et je veux récupérer le contenu de cette url.
OriginalL'auteur arsenal | 2011-07-14
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir la ClientPNames.ALLOW_CIRCULAR_REDIRECTS à true, cela permettra redirige vers le même emplacement.
Voir plus d'informations ici
En fait ce n'est pas juste pour empêcher le HttpClient de jeter de redirection de l'erreur. Cela signifie que la redirection est toujours en train de se passer ? Comme Adam a mentionné n'a pas ce besoin d'une solution permanente au niveau du serveur ?
reçois toujours le message d'erreur suivant :
Caused by: org.apache.http.client.RedirectException: Maximum redirects (50) exceeded
Naturellement. Votre serveur web est configuré, et il a une redirection en boucle(c'est à dire même après 50 requêtes, le serveur est encore en vous redirigeant dans ce cas) ce n'est pas quelque chose que vous pouvez fixer sur le client.
je ne peux pas augmenter la redirection comte? ne pouvais pas trouver n'importe quelle méthode.. et si le serveur web est configuré de la façon dont est le navigateur web capable de l'ouvrir normalement? c'est l'url
http://www.wsj.com/video/khorasan-meet-the-new-us-terrorist-target/157FA4EF-D44F-49BA-938B-002A91A090A3.html
OriginalL'auteur
Vous venez de l'éviter. HttpClient détecté la circulaire de redirection et a déclenché une exception. S'il n'avait pas été "éviter", il continuera de rediriger toujours (jusqu'à ce que vous avez décidé de tuer le processus). Il n'y a pas beaucoup d'autres options, si c'est ce que le serveur répond avec.
La seule façon de vraiment éviter une circulaire de redirection de la boucle est de fixer le serveur.
Si vous vous demandez ce qui se passe (comme ça ça a l'air de trouver dans un navigateur, mais pas à partir de votre programme), essayez de tourner sur une partie de l'HttpClient de journalisation. En particulier, assurez-vous que vous pouvez voir tous les en-têtes HTTP envoyés en arrière et en avant. Vous pouvez alors regarder à la conversation lorsque vous faites la même demande dans votre navigateur, en notant les différences. Il pourrait être un manque de cookie, fou de détection du navigateur, etc...
Il y a un certain nombre de moyens de suivi de votre navigateur. Voici quelques façons que j'utilise souvent, dans l'ordre, du plus simple au plus compliqué (à mon humble avis):
À faible niveau de test, essayez d'utiliser telnet (sauf si vous utilisez Windows, dans ce cas, vous pourriez être mieux avec quelque chose comme Mastic/plink) et statuant/ce modifications entraînent la circulaire redirections.
J'ai mis à jour ma réponse avec quelques suggestions pour diagnostiquer le problème
Je suis à l'aide de firebug dans mon firefox.. Donc dans le firebug quand je vois la réponse.. je vois 302 Found, 302 Déplacé temporairement, puis atlast 200 OK pour la même url dans mon firebug.
Je pense que vous devriez essayer et de regarder TOUS les en-têtes, et pas seulement le code de réponse, et de comprendre ce qui est différent au sujet de la demande à partir de Firefox (qui fonctionne correctement), et celles de votre application (qui n'est pas le cas). Vous pouvez utiliser quelque chose comme
telnet
mélanger et assortir les en-têtes de la demandeOriginalL'auteur
Il y a un bug qui sera la cause de la circulaire de redirection Apache HttpClient depuis la 4.0, il n'était pas fixe, même dans la version la plus récente.
Dans DefaultRequestDirector.java il crée un HttpRedirect pour effectuer la redirection, et il va réutiliser tous les en-têtes de votre original HttpGet, le problème ici est qu'il va réutiliser Hôte en-tête, ce qui signifie que le serveur sera toujours obtenir l'hôte d'origine après sa tentative de rediriger à nouveau URI.
J'ai corrigé cela en réimplémentée la DefaultRequestDirector:
et DefaultHttpClient:
Maintenant, je ne vais pas me plaindre de la Circulaire de Redirection.
OriginalL'auteur
Vérifier que votre demande n'est pas envoyée à un serveur proxy avant d'être envoyé à l'adresse url que vous avez demandé.
OriginalL'auteur
Vous pouvez essayer:
OriginalL'auteur