2011-06-02 8 views
5

Estoy OBTENIENDO una página con Apache HttpClient y quiero almacenar el cuerpo http de la respuesta del servidor en una cadena para poder manipular esta cadena y imprímalo en la consola.Apache HttpClient en Java, instream.toString = org.apache.http.conn.EofSensorInputStream

Desafortunadamente cuando se ejecuta este método me sale este mensaje de nuevo:

17:52:01,862 INFO Driver:53 - fetchPage STARTING 
17:52:07,580 INFO Driver:73 - fetchPage ENDING, took 5716 
[email protected] 

La Clase fetchPage:

public String fetchPage(String part){ 
    log.info("fetchPage STARTING"); 
    long start = System.currentTimeMillis(); 

    String reply; 

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(searchurl); 
    HttpResponse response; 
    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      int l; 
      byte[] tmp = new byte[2048]; 
      while ((l = instream.read(tmp)) != -1) { 
      } 
      long elapsedTimeMillis = System.currentTimeMillis()-start; 
      log.info("fetchPage ENDING, took " + elapsedTimeMillis); 
      reply = instream.toString(); 
      System.out.println(reply); 
      return reply; 
     } 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return null; 
} 
+6

La clave para entender aquí es que 'toString()' en una 'InputStream 'no es un método para leer su contenido como' Cadena', sino más bien para obtener una representación de cadena simple del objeto en sí. Normalmente (incluido en este caso) un 'InputStream' no tiene una representación de cadena útil que pueda proporcionar, por lo que solo utiliza el' Object.toString() 'predeterminado. – ColinD

Respuesta

10

Está llamando a los métodos toString en el InputStream después de que ya ha leído a través. Necesita crear su cadena a partir de las matrices de bytes. La manera más sencilla de obtener la versión de cadena del contenido es utilizar el EntityUtils.toString(HttpEntity)

la impl exacta se vería así:

import org.apache.http.util.EntityUtils; 

public String fetchPage(String part){ 
    log.info("fetchPage STARTING"); 
    long start = System.currentTimeMillis(); 

    String reply; 

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(searchurl); 
    HttpResponse response; 
    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      return EntityUtils.toString(entity); 
     } 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return null; 
} 
+0

Si agrego 'long elapsedTimeMillis = System.currentTimeMillis() - start;' justo antes de 'return EntityUtils.toString (entidad);' el tiempo transcurrido para el procedimiento es de aproximadamente 1300ms, si detengo el tiempo después de 'String result = EntityUtils.toString (entidad); 'y luego' return result' lleva unos 5500ms. ¿Sabes por qué es eso? –

+2

@Jack: Probablemente porque el cliente no tiene que haber recibido todos los datos que el servidor está enviando en el punto donde obtiene la entidad. Crear la cadena requiere en realidad leer todo el contenido que el servidor está enviando. – ColinD

+1

@Jack Murphy: EntityUtils.toString (entidad) está leyendo la secuencia. El cliente aún no ha recibido toda la información. Querrá que este último capture la cantidad de tiempo de transferencia. – Joshua

Cuestiones relacionadas