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);
}
}
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();
}
}
}
Vous devez faire ce qui suit après avoir appelé openConnection
.
Jeter l'urlconnection à httpurlconnection
Call GetResponsecode
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.