Какую правильную длину содержимого установить для запроса GET? - PullRequest
15 голосов
/ 17 декабря 2011

Когда я делаю запрос 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 ред. Что является правильным ContentLength для запроса GET?

1 Ответ

26 голосов
/ 17 декабря 2011

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

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

(RFC2616) 14.13 Длина содержимого

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

Приложения ДОЛЖНЫ использовать это поле для указания длины передачи тела сообщения, если это не запрещено правилами в разделе 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) не позволяет отправлять тело объекта в запросах.

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

...