116 votos

¿Cómo puedo obtener una respuesta http del cuerpo como una cadena en Java?

Sé que había una manera de llegar es con apache commons como se indica a continuación: 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 yo creo que esto está en desuso. Hay alguna otra manera de hacer una solicitud http get en java y obtener la respuesta del cuerpo como una cadena y no un stream?

211voto

shahtapa Puntos 491

Aquí están dos ejemplos de mi proyecto de trabajo.

  1. El uso de 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. El uso de BasicResponseHandler

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

82voto

WhiteFang34 Puntos 28652

Cada biblioteca puedo pensar devuelve una secuencia. Usted podría utilizar IOUtils.toString() de Apache Commons IO para leer un InputStream a una String en una llamada a un método. E. g.:

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: he cambiado el ejemplo anterior, el uso de la codificación del contenido de la respuesta, si está disponible. De lo contrario, voy a por defecto UTF-8 como una de las mejores adivinar, en lugar de utilizar el sistema por defecto.

44voto

moonlightcheese Puntos 4818

He aquí un ejemplo de un sencillo proyecto que estaba trabajando sobre el uso de la librería 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);
}

sólo uso EntityUtils para agarrar el cuerpo de la respuesta como una Cadena. muy simple.

27voto

McDowell Puntos 62645

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

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.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 de la Content-Type encabezado de respuesta HTTP.

Este encabezado contiene información acerca de la carga útil y que podría definir la codificación de datos textuales. Incluso si usted asume los tipos de texto, usted puede necesitar para inspeccionar el contenido de la misma, para determinar la correcta codificación de caracteres. E. g. ver el HTML 4 de especificaciones para obtener más detalles sobre cómo hacer que para ese formato en particular.

Una vez que la codificación es conocido, un InputStreamReader se puede utilizar para descifrar los datos.

Esta respuesta depende del servidor haciendo lo correcto - si usted desea para tratar casos donde los encabezados de respuesta no coincida con el documento o el documento de declaraciones no coinciden con la codificación que se utiliza, que es otra hervidor de pescado.

6voto

Akshay Puntos 33

La Respuesta por McDowell es correcta. Sin embargo, si usted pruebe las sugerencias de otros en algunos de los puestos de arriba.

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

A continuación, se le dará illegalStateException que indica que el contenido ya consumido.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X