URLConnection не позволяет мне получить доступ к данным об ошибках Http (404 500 и т.д.)
Я создаю искатель и должен получать данные из потока независимо от того, является ли он 200 или нет. CURL делает это, как и любой стандартный браузер.
На самом деле не получается получить содержимое запроса, даже если есть какое-то исключение, которое генерируется с кодом состояния ошибки HTTP. Я хочу выход независимо, есть ли способ? Я предпочитаю использовать эту библиотеку, поскольку она действительно будет выполнять постоянные соединения, что идеально подходит для типа сканирования, которое я выполняю.
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);
}
}
}
Работал, спасибо: вот что я придумал - как примерное доказательство концепции:
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);
}
}
Ответы
Ответ 1
Простой:
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();
}
}
Вы можете обратиться к Javadoc для объяснения. Лучший способ, которым я бы справился с этим, заключается в следующем:
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();
}
}
}
Ответ 2
Вам нужно сделать следующее после вызова openConnection
.
-
Передача URL-соединения в HttpURLConnection
-
Вызов getResponseCode
-
Если ответ является успешным, используйте getInputStream, иначе используйте getErrorStream
(Тест на успех должен быть 200 <= code < 300
, потому что есть допустимые коды успеха HTTP, отличные от 200.)
Я создаю искатель и должен получать данные из потока независимо от того, является ли он 200 или нет.
Просто имейте в виду, что если код является 4xx или 5xx, тогда "данные" скорее всего будут страницей с ошибкой.
Конечная точка, которая должна быть сделана, заключается в том, что вы всегда должны уважать файл robots.txt... и читать Условия использования, прежде чем обходить/очищать содержимое сайта, владельцам которого может быть интересно. Простое высказывание GET-запросов, вероятно, раздражает владельцев сайтов... если вы уже не пришли к какой-то "договоренности" с ними.