Подтвердить что ты не робот

Какая правильная Content-Length задана для запроса GET?

Когда я делаю запрос POST, используя следующий код:

string body = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(body);
WebRequest request = WebRequest.Create("http://internalurl");
request.Method = "POST";
request.ContentLength = bytes.Length;

Я установил длину содержимого в число байтов POST ed. Каков правильный ContentLength для запроса GET?

4b9b3361

Ответ 1

Поскольку вы обычно не отправляете никаких дополнительных данных при выполнении запроса GET, заголовок Content-Length не должен отправляться вообще.

Заголовок Content-Length должен включаться только в том случае, если вы отправляете тело сообщения, а значение соответствующего заголовка всегда является длиной этого поля, измеренного в байтах (OCTET).

(RFC2616) 14.13 Content-Length

Поле Content-Length entity-header указывает размер тела сущности, десятичного числа OCTET, отправленного получателю или, в случае метода HEAD, размер тела объекта, который будет иметь был отправлен, если запрос был GET.

< snip/ >

Приложения СЛЕДУЕТ использовать это поле, чтобы указать длину передачи тела сообщения, если это не запрещено правилами в разделе 4.4.


Он (AFAIK) считал, что плохая практика включает тело сообщения при выполнении запроса GET, но при чтении HTTP RFC2616 я ничего не вижу в заявлении что запрос GET не может содержать тело сообщения.

Хотя я предполагаю, что большинство веб-серверов сегодня не будут отвечать тем, что вы хотите, чтобы они ответили, если вы отправляете данные в теле сообщения и ожидаете, что он будет разбираться и обрабатываться в этом случае.

(RFC2616) 4.3 Тело сообщения

Тело сообщения (если есть) HTTP-сообщения используется для переноса сущность-тело, связанное с запросом или ответом. Тело сообщения отличается от тела объекта только тогда, когда кодирование передачи применяется, как указано полем заголовка Transfer-Encoding (раздел 14,41).

   message-body = entity-body
                | <entity-body encoded as per Transfer-Encoding>

Передача-кодирование ДОЛЖНА использоваться для обозначения любых кодировок передачи применяемые приложением для обеспечения безопасной и надлежащей передачи сообщение. Transfer-Encoding является свойством сообщения, а не сущности, и поэтому МОЖЕТ быть добавлено или удалено любым приложением по цепь запроса/ответа. (Однако в разделе 3.6 устанавливаются ограничения на когда могут использоваться некоторые кодировки передачи.)

Правила для того, когда тело сообщения разрешено в сообщении, различаются для запросы и ответы.

Наличие тела сообщения в запросе сигнализируется включение поля заголовка Content-Length или Transfer-Encoding в запросить заголовки сообщений.

Тело сообщения НЕ ДОЛЖНО быть включено в запрос, если спецификация метода запроса (раздел 5.1.1) не позволяет отправлять тело объекта в запросы.

Сервер ДОЛЖЕН читать и пересылать тело сообщения по любому запросу; если метод запроса не включает определенную семантику для объекта-тела, тогда тело сообщения ДОЛЖНО быть проигнорировано при обработке запроса.