Так как запрос 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 создал ресурс).
Какой оптимальный ответ в этой ситуации?