Запрос HTTP POST разрешено отправлять обратно тело ответа?
В соответствии со спецификацией HTTP:
Если ресурс создан на исходного сервера, ответ СЛЕДУЕТ be 201 (Создано) и содержать объект который описывает статус запросить и ссылается на новый ресурс и заголовок местоположения (см. раздел 14.30).
Означает ли это, что запрос POST всегда должен отправлять URI перенаправления в заголовке местоположения без тела ответа?
Ответы
Ответ 1
Вполне допустимо указать тело ответа и одновременно использовать заголовок Location. При использовании заголовка Location с ответом 201 вы не перенаправляете клиента, вы просто говорите ему, где он может найти ресурс в будущем.
Переадресация применяется только к ответам 3xx.
документы W3C для этого объясняют далее, хотя текст на самом деле довольно неоднозначный:
Поле заголовка ответа местоположения используется для перенаправления получателя в другое место, кроме Request-URI, для завершения запроса или идентификации нового ресурса. Для ответов 201 (Создано) это местоположение нового ресурса, созданного запросом. Для ответов 3xx местоположение ДОЛЖНО указывать предпочтительный URI сервера для автоматического перенаправления ресурса.
Я читал это как "... перенаправить... или... identif [y]... новый ресурс", но это не совсем простое английское предложение.
Ответ 2
На основе пункта 9.5 спецификации HTTP 1.1, которая является ссылкой на такие вопросы, вот мое понимание:
Да, вы можете, и в спецификации ясно, что вы можете сделать и как это сделать:
Действие, выполняемое методом POST
, может не привести к ресурсу, который может быть идентифицирован с помощью URI. В этом случае либо 200
(ОК), либо 204
(Нет содержимого) является соответствующим статусом ответа, в зависимости от того, включает ли ответ объект, который описывает результат.
Если ресурс был создан на исходном сервере, ответ должен быть 201
(создан) и содержать объект, который описывает статус запроса и ссылается на новый ресурс, и заголовок Location (см. раздел 14.30).).
Ответы на этот метод не подлежат кэшированию, если только ответ не содержит соответствующих полей заголовка Cache-Control
или Expires
. Тем не менее, ответ 303
(См. Раздел "Прочее" ) может использоваться для указания пользовательскому агенту для получения кэшируемого ресурса.