capturar - obtener url java
Java-¿Cómo encontrar la URL redirigida de una url? (6)
@balusC Hice lo que escribiste. En mi caso, he agregado información de cookies para poder reutilizar la sesión.
// get the cookie if need
String cookies = conn.getHeaderField("Set-Cookie");
// open the new connnection again
conn = (HttpURLConnection) new URL(newUrl).openConnection();
conn.setRequestProperty("Cookie", cookies);
Estoy accediendo a páginas web a través de Java de la siguiente manera:
URLConnection con = url.openConnection();
Pero en algunos casos, una URL redirige a otra url. Por lo tanto, quiero saber la URL a la que redirigió la URL anterior.
Debajo están los campos de encabezado que obtuve como respuesta:
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]
Por lo tanto, en este momento, estoy construyendo la url redireccionada a partir del valor del campo del encabezado Set-Cookie
. En el caso anterior, la url redirigida es copenhagen.craigslist.org
¿Hay alguna manera estándar a través del cual puedo determinar qué url va a redirigir la URL particular?
Sé que cuando una URL redirige a otra url, el servidor envía una respuesta intermedia que contiene un campo de encabezado de Location
que le dice a la url redireccionada pero no estoy recibiendo esa respuesta intermedia a través de url.openConnection();
método.
Eche un vistazo a la documentación de la API de la clase HttpURLConnection
, especialmente setInstanceFollowRedirects()
.
En realidad, sugeriría usar una biblioteca sólida de código abierto como un cliente http. Si echas un vistazo al cliente http de ASF, encontrarás la vida mucho más fácil. Es un cliente robusto, escalable y fácil de usar para http.
Simplemente llame a getUrl () en la instancia de URLConnection después de llamar a 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 necesita saber si la redirección sucedió antes de obtener sus contenidos, aquí está el código de muestra:
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 );
URLConnection
el URLConnection
a HttpURLConnection
e indicarle que no siga los redireccionamientos configurando HttpURLConnection#setInstanceFollowRedirects()
como false
. También puede establecerlo globalmente mediante HttpURLConnection#setFollowRedirects()
.
Solo necesita manejar los redireccionamientos usted mismo. Compruebe el código de respuesta mediante HttpURLConnection#getResponseCode()
, tome el encabezado Location
por URLConnection#getHeaderField()
y luego URLConnection#getHeaderField()
una nueva solicitud HTTP en él.
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;
}
Para obtener " User-Agent " y " Referer " usted mismo, simplemente vaya al modo de desarrollador de uno de su navegador instalado (por ejemplo, presione F12 en Google Chrome). Luego vaya a la pestaña ''Red'' y luego haga clic en una de las solicitudes. Deberías ver sus detalles. Simplemente presione la pestaña secundaria ''Encabezados'' (la imagen a continuación)