2012-01-13 5 views
9

В моем коде я использую некоторый запрос Http Get для загрузки некоторых файлов в виде потока. Я использую следующий код:HTTP Get: Загрузка только заголовка? (HEAD не поддерживается)

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

Но это загружает полное содержание ответа. Я хочу получить только заголовки http без содержимого. Запрос HEAD, похоже, не работает, потому что тогда я получаю статус 501, не реализованный. Как я могу это сделать?

+1

просто не читайте тело ответа? – irreputable

+0

@irreputable Я бы сделал это, если бы знал, как;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity(). GetContent());' это то, что читает сущность; вы, вероятно, просто не можете этого сделать? –

ответ

17

Вместо того, чтобы сделать запрос GET, вы могли бы рассмотреть просто сделать HEAD запрос:

Метод ГОЛОВА идентичен GET, за исключением, что сервер НЕ ДОЛЖЕН возвращение тела сообщения в ответе. Метаинформация, содержащая в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентичной информации, отправленной в ответ на запрос GET. Этот метод может использоваться для получения метаинформации об объекте, подразумеваемой запросом , без передачи самого объекта-объекта. Этот метод часто используется для тестирования гипертекстовых ссылок на достоверность, доступность, и недавнюю модификацию.

+0

Я пробовал это, но теперь заголовок выглядит по-другому :(Я снова проверил, и код состояния 501, не реализован. Поэтому мой сервер, похоже, не обрабатывает такой запрос. другие возможности? – RoflcoptrException

+0

@Roflcoptr - это хромой. Вы можете * использовать заголовок ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) чтобы запросить диапазон 0-0 объекта, но я никогда не использовал заголовки «Range» или частичные ответы, поэтому я не могу говорить об этом. Возможно, кто-то еще может прослушивать. Кроме того, возможно, что сервер будет игнорировать эти заголовки тоже. –

+0

На данный момент я нашел обходной путь. Я делаю запрос на получение, но как только я получил заголовок, я вызываю прерывание. Является ли это хорошей практикой? – RoflcoptrException

5

Возможно, вы можете использовать Range header в своем запросе, чтобы указать диапазон байтов для включения в объект ответа. Возможно, что-то вроде:

Range: bytes=0-0 

Если он работает, вы должны получить обратно 206 Partial Content с байтами, указанными в вашем Range заголовке присутствует в сущности ответа. Тем не менее, я не пробовал, и это также не гарантировано работать:

Сервер может игнорировать заголовок Range.

+1

Что странно, что сервер реализует Range, но не HEAD? Кроме того, диапазон 0-0 охватывает 1 байт. – irreputable

+0

@irreputable - Да, это тоже мое мышление; вполне вероятно, что сервер не будет иметь этого доступного, если не будет реализован 'HEAD'. Что касается 1-байтовой вещи, RFE2616 (раздел 14.35.1) говорит: * «Если значение last-byte-pos присутствует, оно ДОЛЖНО быть больше ** или равно ** first-byte-pos в этом byte-range-spec, или байт-диапазон-spec синтаксически недействителен. "* - для меня это говорит о том, что допустим 0-байтовый диапазон. –

+1

0-0 действителен, но это означает 1 байт, 0-й байт.вы не можете запросить 0 байтов; ответ 206 не может вернуть 0 байтов. это действительно немного странно. хотя на практике запрос 0 байтов не был бы полезен; но неспособность сделать это противоречит инстинктам программиста. – irreputable