2012-01-13 23 views
9

Nel mio codice, utilizzo una richiesta Http Get per scaricare alcuni file come stream. Io uso il seguente codice:HTTP Get: scaricare solo l'intestazione? (HEAD non è supportato)

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

Ma questo scarica l'intero contenuto della risposta. Voglio recuperare solo le intestazioni http senza il contenuto. Una richiesta HEAD sembra non funzionare perché poi ottengo lo stato 501, non implementato. Come lo posso fare?

+1

non leggere il corpo della risposta? – irreputable

+0

@irreputable Lo farei se vorrei sapere come;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity(). GetContent());' è ciò che sta leggendo l'entità; probabilmente non puoi farlo? –

risposta

17

Invece di fare una richiesta GET, si potrebbe prendere in considerazione solo fare una richiesta HEAD:

Il metodo HEAD è identico a GET, tranne che il server NON DEVE ritorno un messaggio-corpo nella risposta. La metainformazione conteneva nelle intestazioni HTTP in risposta a una richiesta HEAD DOVREBBE essere identica alle informazioni inviate in risposta a una richiesta GET. Questo metodo può essere utilizzato per ottenere la metainformation sull'entità implicita dalla richiesta senza trasferire il corpo dell'entità stesso. Questo metodo è spesso utilizzato per testare collegamenti ipertestuali per validità, accessibilità, e modifiche recenti.

+0

Ho provato questo, ma l'intestazione sembra diversa ora :(Ho controllato di nuovo e il codice di stato è 501, non implementato. Quindi il mio server sembra non gestire tale richiesta. altre possibilità? – RoflcoptrException

+0

@Roflcoptr - Questo è zoppo. Potresti * essere in grado di usare l'intestazione ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) per richiedere un intervallo 0-0 dell'entità, ma non ho mai usato le intestazioni o le risposte parziali 'Range', quindi non posso davvero parlare a questo. Forse qualcun altro può intervenire. Inoltre, è possibile che il server Ignora anche queste intestazioni –

+0

Per ora ho trovato una soluzione alternativa: faccio una richiesta ma non appena ho ricevuto l'intestazione, chiamo abort .. È questa buona pratica? – RoflcoptrException

5

si potrebbe essere in grado di utilizzare il Range header nella richiesta per specificare un intervallo di byte per includere nell'entità risposta. Forse qualcosa di simile:

Range: bytes=0-0 

Se funziona, si dovrebbe ricevere indietro un 206 Partial Content con i byte specificati nel Range intestazione presenti nell'entità risposta. Tuttavia, non ho provato questo, e non è inoltre garantito a lavorare:

un server può ignorare l'intestazione Range.

+1

qual è il dispari che un server implementa Range ma non HEAD? inoltre, l'intervallo 0-0 copre 1 byte. – irreputable

+0

@irreputable - Sì, è quello che penso anch'io; è probabile che il server non abbia questo disponibile dato il 'HEAD' non implementato. Per quanto riguarda la cosa a 1 byte, RFE2616 (sezione 14.35.1) dice: * "Se il valore dell'ultimo byte-byte è presente, DEVE essere maggiore di ** o uguale a ** il primo byte-pos in quel specifica per intervallo di byte, o specifica per intervallo di byte non è sintatticamente valida. "* - per me, questo dice che un intervallo di 0 byte è valido. –

+1

0-0 è valido, ma significa 1 byte, il 0 ° byte.non puoi richiedere 0 byte; una risposta 206 non può restituire 0 byte. è davvero un po 'strano. sebbene in pratica, la richiesta di 0 byte non sarebbe utile; ma non essere in grado di farlo è contrario agli istinti del programmatore. – irreputable

Problemi correlati