На HTTP GET, появляются ли заголовки первыми, а затем идут с телом (с использованием библиотеки HttpClient из apache)? - PullRequest
0 голосов
/ 04 января 2011

Что я делаю : Попытка ознакомиться с протоколом HTTP и его реализацией.

Мой вопрос : Можно ли получить заголовки (в частности, Content-Length) HTTP GET, прежде чем вы прочитаете фактическое тело? Из того, что я понимаю, я мог бы использовать вызов HEAD для этой цели, но я пытаюсь понять, требуется ли это вообще. В частности, в библиотеке общих ресурсов HttpClient (и, как мне кажется, в большинстве других) есть методы для получения тела ответа в виде потока. Этот поток читается из сокета по мере его поступления или он уже был буферизован?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 04 января 2011

HTTP-сервер отправляет заголовки первыми.Независимо от того, использует ли конкретный HTTP-клиент, который вы используете, заранее, это отдельный вопрос.

1 голос
/ 04 января 2011

Если поле заголовка длины содержимого отправлено в заголовке ответа, вы можете прочитать его перед телом ответа.Но иногда (динамически генерируемый контент, небуферизованный) его можно опустить ( rfc ).Это то, что происходит, когда ваш браузер не может отображать индикатор выполнения во время загрузки.

0 голосов
/ 04 января 2011

httpclient распространяет потоки классов напрямую из сокета, чтобы не тратить память.Если заголовок длины содержимого пропущен, вы можете прочитать его без чтения во всем теле ответа.

См. http://hc.apache.org/httpclient-3.x/features.html

0 голосов
/ 04 января 2011

Короче говоря, да, заголовки идут первыми. Всегда.

Как вы упоминаете, запрос HEAD позволит клиенту извлекать только заголовки и никакого содержимого, однако с помощью запроса GET заголовки всегда доступны и поступают до фактического содержимого. , Однако поле длины содержимого является необязательным для динамического содержимого, поэтому оно может быть недоступно.

В зависимости от вашей реализации, пар может быть, а может и не буферизоваться вообще. Но в большинстве случаев при чтении через потоковые операторы вы получаете контент в небольшом буферизованном блоке, обычно в строке.

...