utils org example java apache-httpclient-4.x apache-commons

org - ¿Cómo puedo obtener un cuerpo de respuesta http como una cadena en Java?



httpclient apache proxy (9)

Sé que solía haber una manera de obtenerlo con Apache commons, como se documenta aquí: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html y un ejemplo aquí:

http://www.kodejava.org/examples/416.html

pero creo que esto está en desuso. ¿Hay alguna otra forma de hacer una solicitud de obtención de http en Java y obtener el cuerpo de la respuesta como una cadena y no como una secuencia?


¿Qué tal solo esto?

org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));


A continuación se muestra una forma simple de acceder a la respuesta como una cadena utilizando la biblioteca Apache HTTP Client.

import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; //... HttpGet get; HttpClient httpClient; // initialize variables above ResponseHandler<String> responseHandler = new BasicResponseHandler(); String responseBody = httpClient.execute(get, responseHandler);


Aquí hay dos ejemplos de mi proyecto de trabajo.

  1. Usando EntityUtils y HttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL)); HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity, "UTF-8"); System.out.println(responseString);

  2. Usando BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL)); String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString);


Aquí hay un ejemplo de otro proyecto simple en el que estaba trabajando usando la biblioteca httpclient de Apache:

String response = new String(); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("j", request)); HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs); HttpPost httpPost = new HttpPost(mURI); httpPost.setEntity(requestEntity); HttpResponse httpResponse = mHttpClient.execute(httpPost); HttpEntity responseEntity = httpResponse.getEntity(); if(responseEntity!=null) { response = EntityUtils.toString(responseEntity); }

solo use EntityUtils para tomar el cuerpo de la respuesta como una Cadena. muy simple.


Aquí hay una forma ligera de hacerlo:

String responseString = ""; for (int i = 0; i < response.getEntity().getContentLength(); i++) { responseString += Character.toString((char)response.getEntity().getContent().read()); }

Con, por supuesto, responseString contiene la respuesta y respuesta del sitio web que es tipo de HttpResponse , devuelto por HttpClient.execute(request)


Esto es relativamente simple en el caso específico, pero bastante complicado en el caso general.

HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet("http://.com/"); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); System.out.println(EntityUtils.getContentMimeType(entity)); System.out.println(EntityUtils.getContentCharSet(entity));

La respuesta depende del encabezado de respuesta HTTP de Content-Type .

Este encabezado contiene información sobre la carga útil y podría definir la codificación de los datos textuales. Incluso si supone tipos de texto , es posible que deba inspeccionar el contenido para determinar la codificación de caracteres correcta. Por ejemplo, consulte la especificación de HTML 4 para obtener detalles sobre cómo hacer eso para ese formato en particular.

Una vez que se conoce la codificación, se puede usar un InputStreamReader para decodificar los datos.

Esta respuesta depende de que el servidor haga lo correcto: si desea manejar casos donde los encabezados de respuesta no coinciden con el documento, o las declaraciones del documento no coinciden con la codificación utilizada, esa es otra olla de pescado.


La respuesta de McDowell es correcta. Sin embargo, si intentas otra sugerencia en algunas de las publicaciones anteriores.

HttpEntity responseEntity = httpResponse.getEntity(); if(responseEntity!=null) { response = EntityUtils.toString(responseEntity); S.O.P (response); }

Luego, le dará illegalStateException indicando que el contenido ya está consumido.


Podemos usar el código a continuación también para obtener la respuesta HTML en Java

import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.HttpResponse; import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.log4j.Logger; public static void main(String[] args) throws Exception { HttpClient client = new DefaultHttpClient(); // args[0] :- http://hostname:8080/abc/xyz/CheckResponse HttpGet request1 = new HttpGet(args[0]); HttpResponse response1 = client.execute(request1); int code = response1.getStatusLine().getStatusCode(); try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) { // Read in all of the post results into a String. String output = ""; Boolean keepGoing = true; while (keepGoing) { String currentLine = br.readLine(); if (currentLine == null) { keepGoing = false; } else { output += currentLine; } } System.out.println("Response-->" + output); } catch (Exception e) { System.out.println("Exception" + e); } }


Cada biblioteca en la que puedo pensar devuelve una secuencia. Puede usar IOUtils.toString() de Apache Commons IO para leer un InputStream en una String en una llamada a un método. P.ej:

URL url = new URL("http://www.example.com/"); URLConnection con = url.openConnection(); InputStream in = con.getInputStream(); String encoding = con.getContentEncoding(); encoding = encoding == null ? "UTF-8" : encoding; String body = IOUtils.toString(in, encoding); System.out.println(body);

Actualización: Cambié el ejemplo anterior para usar la codificación de contenido de la respuesta, si está disponible. De lo contrario, será el valor predeterminado de UTF-8 como mejor suposición, en lugar de usar el valor predeterminado del sistema local.