Запрос 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 (См. Раздел "Прочее" ) может использоваться для указания пользовательскому агенту для получения кэшируемого ресурса.