2012-01-13 19 views
9

W moim kodzie używam żądania Http Get, aby pobrać niektóre pliki jako strumień. Używam następującego kodu:HTTP Get: Pobierz tylko nagłówek? (HEAD nie jest obsługiwany)

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

Ale to pobiera pełną treść odpowiedzi. Chcę pobrać tylko nagłówki http bez zawartości. Wydaje się, że żądanie HEAD nie działa, ponieważ wtedy otrzymuję status 501, a nie zaimplementowany. Jak mogę to zrobić?

+1

po prostu nie czytasz treści odpowiedzi? – irreputable

+0

@irreputable Zrobiłbym to, gdybym wiedział jak;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity(). GetContent());' jest tym, co czyta encję; prawdopodobnie nie możesz tego zrobić? –

Odpowiedz

17

Zamiast żądania GET, można rozważyć tylko składając wniosek HEAD:

Metoda HEAD jest identyczna z GET wyjątkiem, że serwer nie może zwrotny komunikat ciała w odpowiedzi. Metainformacja zawierająca w nagłówkach HTTP w odpowiedzi na żądanie HEAD POWINNA być identyczna pod względem z informacjami wysłanymi w odpowiedzi na żądanie GET. Ta metoda może być użyta do uzyskania metainformacji o encji implikowanej przez żądanie bez przenoszenia samej jednostki encji. Ta metoda to często używana do testowania łączy hipertekstowych pod kątem poprawności, dostępności, i ostatniej modyfikacji.

+0

Próbowałem tego, ale nagłówek wygląda teraz inaczej :(Sprawdziłem ponownie i kod stanu jest 501, nie zaimplementowany, więc mój serwer wydaje się nie obsługiwać takich żądań. inne możliwości? – RoflcoptrException

+0

@Roflcoptr - To lame. Możesz * być * w stanie użyć nagłówka ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) aby zażądać zakresu encji 0-0, ale nigdy nie używałam nagłówków '' Range' ani częściowych odpowiedzi, więc naprawdę nie mogę z tym porozmawiać. Być może ktoś inny może zadzwonić. Możliwe też, że serwer Zignoruj ​​te nagłówki, –

+0

Na razie znalazłem obejście.Zapraszam do otrzymania żądania, ale jak tylko otrzymałem nagłówek, nazywam abortem.Jest to dobra praktyka? – RoflcoptrException

5

Możliwe jest użycie w żądaniu numeru Range header w celu określenia zakresu bajtów do uwzględnienia w jednostce odpowiedzi. Być może coś takiego:

Range: bytes=0-0 

Jeśli to nie działa, należy otrzymać z powrotem 206 Partial Content z bajtów określonych w nagłówku obecnej w jednostce odpowiedzi Range. Jednak ja nie próbowałem tego, a to nie jest również gwarantowana pracować:

serwer może zignorować nagłówka Range.

+1

jaka jest różnica, że ​​serwer implementuje Range, ale nie HEAD? także, zakres 0-0 obejmuje 1 bajt. – irreputable

+0

@irreputable - Tak, to też moje myślenie; jest prawdopodobne, że serwer nie będzie miał tego dostępnego, biorąc pod uwagę niewdrożone "HEAD". Jeśli chodzi o element 1-bajtowy, RFE2616 (sekcja 14.35.1) mówi: * "Jeśli obecna jest wartość ostatniego bajta-POS, MUSI być ona większa niż ** lub równa ** wartość pierwszego bajtu w tym bajt-range-spec lub specyfikacja zakresu bajtów jest niepoprawna pod względem składni. "* - dla mnie oznacza to, że zakres 0 bajtów jest prawidłowy. –

+1

0-0 jest poprawny, ale oznacza 1 bajt, 0 bajt.nie możesz zażądać 0 bajtów; Odpowiedź 206 nie może zwrócić 0 bajtów. to naprawdę trochę dziwne. chociaż w praktyce żądanie 0 bajtów nie byłoby użyteczne; ale nie może tego zrobić, jest sprzeczne z instynktem programisty. – irreputable

Powiązane problemy