POST/Redirect/GET (PRG) против значимых кодов ответа 2xx

Так как запрос 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 создал ресурс).

Какой оптимальный ответ в этой ситуации?

Ответ 1

Отправлять информацию о человеке в тело ответа как HTML. Не следует различать заголовок User-Agent; если вам также необходимо отправить тела на машины, различайтесь на основе заголовка запроса принятия.

Ответ 2

Если у вас есть контроль над веб-сервером, как насчет различия между заголовком агента? Заполните его только тем, что вы знаете (GUID или другая псевдослучайная вещь) и представляете его на веб-сервере от автоматизированного клиента. Затем ответ веб-сервера должен соответствовать 201/303.