web-dev-qa-db-fra.com

URLConnection ne me permet pas d'accéder aux données sur les erreurs HTTP (404 500, etc.)

Je fais un chenouilleur et je dois obtenir les données du flux, sans distinction de 200 ou non. Curl le fait, ainsi que n'importe quel navigateur standard.

Ce qui suit ne sera pas réellement du contenu de la demande, même s'il existe une partie, une exception est lancée avec le code d'état de l'erreur HTTP. Je veux la sortie, quel que soit leur chemin? Je préfère utiliser cette bibliothèque car elle fera des connexions persistantes, ce qui est parfait pour le type de rampant que je fais.

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

Travaillé, merci: Voici ce que je suis venu, tout comme une preuve approximative du concept:

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);
    }
}
22
MichaelICE

Simple:

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();
   }
}

Vous pouvez vous référer à Javadoc pour expliquer. La meilleure façon de gérer cela est la suivante:

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();
        }
    }
}
46
Buhake Sindi

Vous devez faire ce qui suit après avoir appelé openConnection.

  1. Jeter l'urlconnection à httpurlconnection

  2. Call GetResponsecode

  3. Si la réponse est un succès, utilisez getInputStream, sinon utilisez geterRorStream

(Le test de succès devrait être 200 <= code < 300 Parce qu'il y a des codes de réussite HTTP valides à l'exception de 200.)


Je fais un chenouilleur et je dois obtenir les données du flux, sans distinction de 200 ou non.

Sachez simplement que si le code est un 4xx ou 5xx, les "données" sont susceptibles d'être une page d'erreur d'une sorte.


Le dernier point à faire est que vous devriez toujours respecter le fichier "robots.txt" ... et lire les conditions d'utilisation avant de ramper/racler le contenu d'un site dont les propriétaires puissantes CARE. Il suffit de supprimer simplement les demandes d'épargner des propriétaires de site ... à moins que vous ne l'iez déjà à une sorte de "arrangement" avec eux.

11
Stephen C