Estoy haciendo un rastreador, y necesito obtener los datos de la transmisión independientemente de si es 200 o no. CURL lo está haciendo, así como cualquier navegador estándar.URLConnection no me permite acceder a los datos sobre errores Http (404,500, etc.)
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 de hecho 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);
}
}
}
funcionado, gracias: Esto es lo que me ocurrió con - al igual que 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);
}
}
"InputStream is = connection.getResponseMessage();" No veo el método getResponseMessage en la clase URLConnection, es parte de HttpUrlConnection, entonces ¿no deberíamos encasillar eso? ¿O podemos reemplazar getResponseMessage por getInputStream, o eso arrojará una excepción? – David
Fue un error tipográfico, es 'connection.getInputStream()'. –
Muy buena y breve respuesta –