2012-01-13 22 views
9

En mi código, uso alguna solicitud Http Get para descargar algunos archivos como una secuencia. Utilizo el siguiente código:HTTP Get: ¿Solo descargar el encabezado? (HEAD no es compatible)

public String getClassName(String url) throws ClientProtocolException, IOException { 
     HttpResponse response = sendGetRequestJsonText(url); 

     Header[] all = response.getAllHeaders(); 
     for (Header h : all) { 
      System.out.println(h.getName() + ": " + h.getValue()); 
     } 

     Header[] headers = response.getHeaders("Content-Disposition"); 
     InputStreamParser.convertStreamToString(response.getEntity().getContent()); 
     String result = ""; 
     for (Header header : headers) { 
      result = header.getValue(); 
     } 
     return result.substring(result.indexOf("''") + "''".length(), result.length()).trim(); 
    } 

Pero esto descarga el contenido completo de la respuesta. Quiero recuperar solo los encabezados http sin el contenido. Parece que una solicitud HEAD no funciona porque luego obtengo el estado 501, no implementado. ¿Cómo puedo hacer eso?

+1

Simplemente no lea el cuerpo de la respuesta? – irreputable

+0

@irreputable Haría esto si supiera cómo;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity(). GetContent());' es lo que está leyendo la entidad; probablemente no puedas hacer eso? –

Respuesta

17

En lugar de hacer una petición GET, puede considerar simplemente hacer una solicitud HEAD:

El método HEAD es idéntica a GET excepto que el servidor NO DEBE devolver un mensaje -cuerpo en la respuesta. La metainformación contenida en en los encabezados HTTP en respuesta a una solicitud HEAD DEBERÍA ser idéntica a con la información enviada en respuesta a una solicitud GET. Este método puede usarse para obtener metainformación sobre la entidad implícita en la solicitud sin transferir la entidad-cuerpo en sí. Este método es de uso frecuente para probar enlaces de hipertexto para validez, accesibilidad, y modificaciones recientes.

+0

Intenté esto, pero el encabezado ahora se ve diferente :(Revisé nuevamente y el código de estado es 501, no implementado. Por lo tanto, mi servidor parece no manejar esa solicitud. otras posibilidades? – RoflcoptrException

+0

@Roflcoptr - Eso es cojo. Usted * podría * poder usar el encabezado ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) para solicitar un rango 0-0 de la entidad. Pero nunca he usado encabezados 'Rango' o respuestas parciales, así que no puedo hablar de eso. Tal vez alguien más pueda sonar. También, es posible que el servidor ignore estos encabezados, también. –

+0

Por ahora encontré una solución. Hice una solicitud de obtención pero tan pronto como recibí el encabezado, llamé a abortar. ¿Es esta una buena práctica? – RoflcoptrException

5

Es posible que pueda utilizar el Range header en su solicitud para especificar un rango de bytes para incluir en la entidad de respuesta. Posiblemente algo como:

Range: bytes=0-0 

Si funciona, usted debe recibir de vuelta una 206 Partial Content con los bytes especificados en el encabezado Range presente en la entidad respuesta. Sin embargo, no he intentado esto, y tampoco es garantizado para trabajar:

un servidor puede ignorar la cabecera de la gama.

+1

¿Por qué es extraño que un servidor implemente Rango pero no HEAD? también, el rango 0-0 cubre 1 byte. – irreputable

+0

@irreputable - Sí, ese también es mi pensamiento; es probable que el servidor no lo tenga disponible dado el 'HEAD' no implementado. En cuanto a la cosa de 1 byte, RFE2616 (sección 14.35.1) dice: * "Si el valor de último byte pos está presente, DEBE ser mayor que ** o igual a ** la posición del primer byte en ese byte-range-spec, o byte-range-spec es sintácticamente inválido. "* - para mí, esto dice que un rango de 0 bytes es válido. –

+1

0-0 es válido, pero significa 1 byte, el 0º byte.no puedes solicitar 0 bytes; una respuesta 206 no puede devolver 0 bytes. eso de hecho es un poco extraño. aunque en la práctica, solicitar 0 bytes no sería útil; pero no poder hacerlo es contrario a los instintos del programador. – irreputable

Cuestiones relacionadas