Так как запрос POST в шаблоне POST/Redirect/GET (PRG) возвращает код статуса перенаправления (303 See Other
) при успешном завершении, можно ли вообще сообщить клиенту о конкретном вкусе, которому они могут наслаждаться (например, OK, "Создано", "Принято" и т.д.), а также любые соответствующие заголовки (например, Location
для 201 Created
, которые могут конфликтовать с переадресацией)?
Возможно, было бы целесообразно, например, заставить перенаправленный GET ответить на правильный код ответа и заголовки, которые ожидались бы от ответа POST?
HTTP 1.1 говорит:
Этот метод [303] существует прежде всего для того, чтобы позволить выходному POST-активированному script перенаправить пользовательский агент на выбранный ресурс.
Но не дает никакого представления о потере более обычного кода состояния и заголовков.
Изменить - пример:
Клиент отправляет запрос POST на /orders
, который создает новый ресурс в /orders/1
.
Если сервер отправляет статус 201 Created
с помощью location: /orders/1
, автоматический клиент будет счастлив, потому что он знает, что был создан ресурс, и он знает, где он находится, но человек, использующий веб-браузер, будет недоволен, потому что они снова получают страницу /orders
, и если они обновят ее, они собираются отправить другой заказ, что вряд ли будет тем, что они хотят.
Если сервер отправляет статус 303 See Other
с помощью location: /orders/1
, человек будет принят по их приказу, информирован о его существовании и состоянии и не будет подвержен опасности повторять его случайно. Однако автоматизированному клиенту не будет ясно сказано о создании ресурса, он должен будет сделать создание на основе заголовка Location
. Кроме того, если 303
перенаправляется где-то в другом месте (например, /users/someusername/orders
), человек может быть хорошо размещен, но автоматизированный клиент остается неинформированным.
Мое предложение состояло в том, чтобы отправить 201 Created
как ответ на перенаправленный запрос на получение нового ресурса, но чем больше я думаю об этом, тем меньше мне это нравится (может быть сложно понять, что только создатель получает 201
и не должно показаться, что запрос GET
создал ресурс).
Какой оптимальный ответ в этой ситуации?