J'accède aux pages Web via Java comme suit:
URLConnection con = url.openConnection();
Mais dans certains cas, une URL redirige vers une autre URL. Je veux donc savoir l'URL vers laquelle l'URL précédente a redirigé.
Voici les champs d'en-tête que j'ai reçus en réponse:
null-->[HTTP/1.1 200 OK]
Cache-control-->[public,max-age=3600]
last-modified-->[Sat, 17 Apr 2010 13:45:35 GMT]
Transfer-Encoding-->[chunked]
Date-->[Sat, 17 Apr 2010 13:45:35 GMT]
Vary-->[Accept-Encoding]
Expires-->[Sat, 17 Apr 2010 14:45:35 GMT]
Set-Cookie-->[cl_def_hp=copenhagen; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT, cl_def_lang=en; domain=.craigslist.org; path=/; expires=Sun, 17 Apr 2011 13:45:35 GMT]
Connection-->[close]
Content-Type-->[text/html; charset=iso-8859-1;]
Server-->[Apache]
Donc, actuellement, je construis l'URL redirigée à partir de la valeur du champ d'en-tête Set-Cookie
. Dans le cas ci-dessus, l'URL redirigée est copenhagen.craigslist.org
Existe-t-il un moyen standard par lequel je peux déterminer quelle URL l'URL particulière va rediriger?.
Je sais que lorsqu'une URL redirige vers une autre URL, le serveur envoie une réponse intermédiaire contenant un champ d'en-tête Location
qui indique l'URL redirigée mais je ne reçois pas cette réponse intermédiaire via la méthode url.openConnection();
.
Vous devez convertir le URLConnection
en HttpURLConnection
et lui demander de ne pas suivre les redirections en définissant HttpURLConnection#setInstanceFollowRedirects()
à false
. Vous pouvez également le définir globalement par HttpURLConnection#setFollowRedirects()
.
Vous n'avez alors qu'à gérer vous-même les redirections. Vérifiez le code de réponse par HttpURLConnection#getResponseCode()
, récupérez l'en-tête Location
par URLConnection#getHeaderField()
puis lancez un nouveau HTTP demande à ce sujet.
Appelez simplement getUrl () sur l'instance URLConnection après avoir appelé getInputStream ():
URLConnection con = new URL( url ).openConnection();
System.out.println( "orignal url: " + con.getURL() );
con.connect();
System.out.println( "connected url: " + con.getURL() );
InputStream is = con.getInputStream();
System.out.println( "redirected url: " + con.getURL() );
is.close();
Si vous devez savoir si la redirection s'est produite avant d'obtenir réellement son contenu, voici l'exemple de code:
HttpURLConnection con = (HttpURLConnection)(new URL( url ).openConnection());
con.setInstanceFollowRedirects( false );
con.connect();
int responseCode = con.getResponseCode();
System.out.println( responseCode );
String location = con.getHeaderField( "Location" );
System.out.println( location );
public static URL getFinalURL(URL url) {
try {
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setInstanceFollowRedirects(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
con.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
con.addRequestProperty("Referer", "https://www.google.com/");
con.connect();
//con.getInputStream();
int resCode = con.getResponseCode();
if (resCode == HttpURLConnection.HTTP_SEE_OTHER
|| resCode == HttpURLConnection.HTTP_MOVED_PERM
|| resCode == HttpURLConnection.HTTP_MOVED_TEMP) {
String Location = con.getHeaderField("Location");
if (Location.startsWith("/")) {
Location = url.getProtocol() + "://" + url.getHost() + Location;
}
return getFinalURL(new URL(Location));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return url;
}
Pour obtenir " User-Agent " et " Referer " par vous-même, passez simplement en mode développeur de l'un de vos navigateurs installés (par exemple, appuyez sur F12 sur Google Chrome). Allez ensuite dans l'onglet 'Réseau' puis cliquez sur l'une des demandes. Vous devriez voir ses détails. Appuyez simplement sur le sous-onglet 'En-têtes' (l'image ci-dessous)
Jetez un œil à la classe HttpURLConnection
documentation de l'API , en particulier setInstanceFollowRedirects()
.
Je suggère en fait d'utiliser une solide bibliothèque open source en tant que client http. Si vous jetez un œil à client http par ASF, vous trouverez la vie beaucoup plus facile. Il s'agit d'un client facile à utiliser, évolutif et robuste pour http.