java - ejemplo - setrequestmethod
URLConnection no me permite acceder a datos sobre errores de HTTP(404,500, etc.) (2)
Sencillo:
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
if (connection instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) connection;
int statusCode = httpConn.getResponseCode();
if (statusCode != 200 /* or statusCode >= 200 && statusCode < 300 */) {
is = httpConn.getErrorStream();
}
}
Puede referirse a Javadoc para explicación. La mejor manera de manejar esto es como sigue:
URLConnection connection = url.openConnection();
InputStream is = null;
try {
is = connection.getInputStream();
} catch (IOException ioe) {
if (connection instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) connection;
int statusCode = httpConn.getResponseCode();
if (statusCode != 200) {
is = httpConn.getErrorStream();
}
}
}
Estoy haciendo un rastreador, y necesito obtener los datos de la transmisión, independientemente de si es un 200 o no. CURL lo está haciendo, así como cualquier navegador estándar.
Lo siguiente no obtendrá realmente el contenido de la solicitud, aunque hay algunos, se lanza una excepción con el código de estado de error http. Quiero la salida independientemente, ¿hay alguna manera? Prefiero usar esta biblioteca ya que en realidad hará conexiones persistentes, lo cual es perfecto para el tipo de rastreo que estoy haciendo.
package test;
import java.net.*;
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
URL url = new URL("http://github.com/XXXXXXXXXXXXXX");
URLConnection connection = url.openConnection();
DataInputStream inStream = new DataInputStream(connection.getInputStream());
String inputLine;
while ((inputLine = inStream.readLine()) != null) {
System.out.println(inputLine);
}
inStream.close();
} catch (MalformedURLException me) {
System.err.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.err.println("IOException: " + ioe);
}
}
}
Trabajado, gracias: Esto es lo que se me ocurrió, solo como una prueba aproximada del concepto:
import java.net.*;
import java.io.*;
public class Test {
public static void main(String[] args) {
//InputStream error = ((HttpURLConnection) connection).getErrorStream();
URL url = null;
URLConnection connection = null;
String inputLine = "";
try {
url = new URL("http://verelo.com/asdfrwdfgdg");
connection = url.openConnection();
DataInputStream inStream = new DataInputStream(connection.getInputStream());
while ((inputLine = inStream.readLine()) != null) {
System.out.println(inputLine);
}
inStream.close();
} catch (MalformedURLException me) {
System.err.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.err.println("IOException: " + ioe);
InputStream error = ((HttpURLConnection) connection).getErrorStream();
try {
int data = error.read();
while (data != -1) {
//do something with data...
//System.out.println(data);
inputLine = inputLine + (char)data;
data = error.read();
//inputLine = inputLine + (char)data;
}
error.close();
} catch (Exception ex) {
try {
if (error != null) {
error.close();
}
} catch (Exception e) {
}
}
}
System.out.println(inputLine);
}
}
openConnection
hacer lo siguiente después de llamar a openConnection
.
Echa el URLConnection a HttpURLConnection
Llamar a getResponseCode
Si la respuesta es exitosa, use getInputStream, de lo contrario use getErrorStream
(La prueba para el éxito debe ser 200 <= code < 300
porque hay códigos de éxito HTTP válidos aparte de 200.)
Estoy haciendo un rastreador, y necesito obtener los datos de la transmisión, independientemente de si es un 200 o no.
Solo tenga en cuenta que si el código es 4xx o 5xx, es probable que los "datos" sean una página de error de algún tipo.
El último punto que debe hacerse es que siempre debe respetar el archivo "robots.txt" ... y leer los Términos de servicio antes de rastrear / raspar el contenido de un sitio a cuyos propietarios les pueda interesar. El simple hecho de rechazar las solicitudes de GET puede molestar a los propietarios del sitio ... a menos que ya haya llegado a algún tipo de "acuerdo" con ellos.