URLConnection не позволяет мне получить доступ к данным об ошибках Http (404 500 и т.д.) - программирование
Подтвердить что ты не робот

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);
    }
}
4b9b3361

Ответ 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-запросов, вероятно, раздражает владельцев сайтов... если вы уже не пришли к какой-то "договоренности" с ними.