Что такое поле «Content-Length» в заголовке HTTP?

282

Что это означает?

  1. Количество байтов кодированной строки содержимого с кодировкой, указанной в заголовке.
  2. Количество символов в строке содержимого.

Особенно в случае Content-Type: application/x-www-form-urlencoded.

Eonil
источник

Ответы:

239

RFC2616

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET, отправленного получателю, или, в случае метода HEAD, размер тела объекта, который был бы отправлен запрос был ПОЛУЧЕН.

Неважно, что тип контента.

Расширение на пост ниже .

Вихрь
источник
14
Объедините этот ответ с ответом Тома Кабански, и вы получите всю необходимую информацию. В случае текста вы можете посчитать количество символов, поскольку ASCII является 8-битным.
2012 г.
9
@hcpl: но текст не всегда ASCII, также ASCII 7-битный, а не 8.
Ли Райан
2
Замените ASCII той кодировкой, которую вы используете, и найдите количество битов, которое требуется для кодировки. Для ответа 7 против 8 бит; Первоначально это было действительно 7 бит, так что вы снова правы. Но сегодня 8 бит используются в большинстве (если не во всех) случаях из-за организации компьютерной памяти. редактировать: перечитывая мой ответ, я вижу, куда вы идете. Я должен перефразировать мой оригинальный комментарий.
hcpl
6
@hcpl: вся причина, по которой проблема байтов и символов значительна, связана с кодировками переменной ширины, такими как UTF-8 и UTF-16, где «количество битов» не фиксировано.
Стефан Карпински
2
не могли бы вы подделать этот номер? например, POST - строковый параметр с огромной длиной, но установить значение content-length равным 1?
Ши-Мин Ли
260

Это количество байтов данных в теле запроса или ответа. Тело - это та часть, которая идет после пустой строки под заголовками.

Том Кабански
источник
1
Вместо «запрос или ответ», разве это не «тело ответа» ТОЛЬКО? В запросе нет пустой строки между заголовком и данными.
ajfbiw.s
я могу изменить длину содержимого заголовка ответа HTTP,
хранящегося в
2
@ ajfbiw.s Рассмотрим запрос на публикацию http. «Присутствие тела сообщения в запросе сигнализируется включением поля заголовка Content-Length или Transfer-Encoding в заголовки сообщения запроса.» Из w3.org/Protocols/rfc2616/rfc2616-sec4.html# с.4.3
Рой Гуанью
68

Content-LengthЗаголовка представляет собой число , обозначающее точную длину в байтах тела HTTP. Тело HTTP начинается сразу после первой пустой строки, которая находится после начальной строки и заголовков.

Обычно Content-Lengthзаголовок используется для HTTP 1.1, так что принимающая сторона знает, когда текущий ответ * закончился, поэтому соединение может быть повторно использовано для другого запроса .

* ... или запрос, в случае методов запроса, имеющих тело, таких как POST, PUT или PATCH

В качестве альтернативы, Content-Lengthзаголовок может быть опущен, и может использоваться разделенный на части Transfer-Encodingзаголовок .

Если оба Content-Lengthи Transfer-Encodingзаголовки отсутствуют, то в конце ответа соединение должно быть закрыто.

Следующий ресурс является руководством, которое я нашел очень полезным при изучении HTTP:

HTTP Made Действительно Легко .

расточитель
источник
45

Один октет составляет 8 бит. Длина содержимого - это количество октетов, которое представляет тело сообщения.

itsproject
источник
37
Октет = AKA Байт?
ViniciusPires
77
@BiniciusPires 'byte' обычно используется для описания наименьшей адресуемой единицы памяти, которая не обязательно составляет 8 бит на всех архитектурах. Вот почему «октет» используется, чтобы избежать двусмысленности
PJK
6
@PJK, нет, не совсем верно. OCTETздесь имеет очень специфическое значение, которое означает «любая 8-битная последовательность данных». См. Определение на w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
Pacerier,
28

Отсюда :

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET, отправленного получателю, или, в случае метода HEAD, размер тела объекта, который был бы отправлен запрос был ПОЛУЧЕН.

   Content-Length    = "Content-Length" ":" 1*DIGIT

Примером является

   Content-Length: 3495

Приложения ДОЛЖНЫ использовать это поле для указания длины передачи тела сообщения, если это не запрещено правилами в разделе 4.4 .

Любое значение Content-Length больше или равно нулю является допустимым значением. В разделе 4.4 описано, как определить длину тела сообщения, если не указана длина содержимого.

Обратите внимание, что значение этого поля значительно отличается от соответствующего определения в MIME, где оно является необязательным полем, используемым в типе содержимого "message / external-body". В HTTP его СЛЕДУЕТ отправлять всякий раз, когда длина сообщения может быть определена до его передачи, если это не запрещено правилами в разделе 4.4.

Моя интерпретация заключается в том, что это означает длину "на проводе", то есть длину * кодированного "контента

Даниэль Реншоу
источник
7
«На проводе» длина будет изменяться в зависимости от сжатия, но правильно сказать длину перед сжатием.
BayssMekanique
Будет ли Content-Length различаться на разных типах машин, таких как Mac / Linux? ИЛИ будет ли он отличаться при использовании другого клиента, такого как curl / postman ...?
Канагавелу Сугамар
1
Предполагая, что все остальное остается одинаковым (например, кодирование, сжатие и т. Д.), Тогда длина контента должна быть независимой от платформы. Это заголовок сервера, поэтому, если он не анализирует пользовательский агент и ведет себя по-другому, клиент не должен иметь никакого значения.
Даниэль Реншоу
Typescript выдает ошибку на этом. Тип 'номер' не может быть назначен типу 'строка | string [] 'так что пример будет"Content-length": "3495"
A. D'Alfonso
8

С этой страницы

На сегодняшний день наиболее распространенным способом использования POST является передача данных HTML-формы в сценарии CGI. В этом случае заголовок Content-Type: обычно является application / x-www-form-urlencoded, а заголовок Content-Length: дает длину данных формы в кодировке URL (вот примечание о кодировке URL). Сценарий CGI получает тело сообщения через STDIN и декодирует его. Вот типичная отправка формы с использованием POST:

POST /path/script.cgi HTTP/1.0
From: frog@jmarshall.com
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Есть
источник
5

Согласно спецификации :

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET, отправленного получателю, или, в случае метода HEAD, размер тела объекта, который был бы отправлен запрос был ПОЛУЧЕН.

Content-Length    = "Content-Length" ":" 1*DIGIT

Примером является

Content-Length: 3495

Приложения ДОЛЖНЫ использовать это поле для указания длины передачи тела сообщения, если это не запрещено правилами в разделе 4.4.

Любое значение Content-Length больше или равно нулю является допустимым значением. В разделе 4.4 описано, как определить длину тела сообщения, если не указана длина содержимого.

Обратите внимание, что значение этого поля значительно отличается от соответствующего определения в MIME, где оно является необязательным полем, используемым в типе содержимого "message / external-body". В HTTP его СЛЕДУЕТ отправлять всякий раз, когда длина сообщения может быть определена до его передачи, если это не запрещено правилами в разделе 4.4.

Божидар Бацов
источник
2

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET, отправленного получателю, или, в случае метода HEAD, размер тела объекта, который был бы отправлен запрос был ПОЛУЧЕН.

Content-Length = "Content-Length" ":" 1 * DIGIT

Примером является

Длина контента: 1024

Приложения ДОЛЖНЫ использовать это поле для указания длины передачи тела сообщения.

В PHP вы бы использовали что-то вроде этого.

header("Content-Length: ".filesize($filename));

В случае «Content-Type: application / x-www-form-urlencoded» закодированные данные отправляются назначенному обработчику, чтобы вы могли установить длину или размер данных, которые вы собираетесь публиковать.

Гаурав Джассал
источник
0

Подумайте, есть ли у вас такие заголовки, как:

content-encoding: gzip
content-length: 52098
content-type: text/javascript; charset=UTF-8

Длина содержимого - это размер сжатого тела сообщения в «октетах» (т. Е. В 8-битных единицах, которые являются «байтами» для всех современных компьютеров).

размер фактического тела сообщения может быть что - то еще, возможно , 150280 байт.

Количество символов снова может быть другим, возможно, 150231 символ, потому что некоторые символы Юникода используют несколько байтов (обратите внимание, UTF-8 является стандартной кодировкой).

Таким образом, разные цифры зависят от того, насколько вам важно, сколько данных передается, сколько данных хранится или сколько символов видно. Конечно, нет никаких гарантий, что эти заголовки будут предоставлены ..

benjimin
источник