setrequestmethod ejemplo java urlconnection

java - ejemplo - setrequestmethod



URLConnection no me permite acceder a datos sobre errores de HTTP(404,500, etc.) (2)

Sencillo:

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

Puede referirse a Javadoc para explicación. La mejor manera de manejar esto es como sigue:

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

Estoy haciendo un rastreador, y necesito obtener los datos de la transmisión, independientemente de si es un 200 o no. CURL lo está haciendo, así como cualquier navegador estándar.

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

Trabajado, gracias: Esto es lo que se me ocurrió, solo como 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); } }


openConnection hacer lo siguiente después de llamar a openConnection .

  1. Echa el URLConnection a HttpURLConnection

  2. Llamar a getResponseCode

  3. Si la respuesta es exitosa, use getInputStream, de lo contrario use getErrorStream

(La prueba para el éxito debe ser 200 <= code < 300 porque hay códigos de éxito HTTP válidos aparte de 200.)

Estoy haciendo un rastreador, y necesito obtener los datos de la transmisión, independientemente de si es un 200 o no.

Solo tenga en cuenta que si el código es 4xx o 5xx, es probable que los "datos" sean una página de error de algún tipo.

El último punto que debe hacerse es que siempre debe respetar el archivo "robots.txt" ... y leer los Términos de servicio antes de rastrear / raspar el contenido de un sitio a cuyos propietarios les pueda interesar. El simple hecho de rechazar las solicitudes de GET puede molestar a los propietarios del sitio ... a menos que ya haya llegado a algún tipo de "acuerdo" con ellos.