Перенаправление с созданным 201
Есть ли способ перенаправить ответ через 201?
RFC указывает, что вновь созданный ресурс должен быть указан в заголовке Location
, и я его определяю. Я предположил, что браузер перенаправит, но это не так, даже если на странице нет контента.
Я хочу, чтобы пользователь после действия POST перенаправлялся на новый ресурс. Поэтому я искушаюсь использовать 303 See Other
, но 201 кажется более подходящим.
Итак, есть ли способ автоматически перенаправить популярные браузеры без вмешательства пользователя и не полагаться на Javascript?
Ответы
Ответ 1
Я думаю, вы смешиваете два разных семантических ответа - один говорит клиенту, что вы успешно создали ресурс и где он. Приходит ли клиент для его получения или нет, это совсем другая история.
Второй сообщает клиенту, что он отправил неправильный URI адреса для запрашиваемого ресурса - и что он должен повторить попытку, но с другим URI.
A 303 подходит в этом случае - на самом деле, он явно рекомендовал для этого:
(из rfc)
Он в основном используется, чтобы позволить выходу действия POST перенаправлять пользовательский агент на выбранный ресурс, поскольку при этом предоставляется информация, соответствующая ответу POST, в форме, которая может быть отдельно идентифицирована, закладована и кэширована, независимо от первоначального запроса.
Ответ 2
Браузер примет действие перенаправления через один из кодов состояния 3xx, спецификация не определяет, что пользовательский агент должен перенаправлять с помощью 201. Вы можете попробовать отправить заголовок обновления, чтобы увидеть если он перенаправляет на заголовок Location
, но я не буду рассчитывать на него. Почему бы не придерживаться ответа 3xx?
Ответ 3
Вы можете отправить заголовок Refresh
.
Ответ 4
Я имею дело с этим в первый раз, и это то, что я решил сделать:
-
GET /user/new
→ 200 Ok
с регистрационной формой пользователя.
-
POST /user
→ 201 Created
новый пользователь отвечает тем же контентом, что и маршрут GET /user
.
-
GET /user
→ 200 Ok
на странице профиля пользователя для аутентифицированного пользователя или для анонимных посетителей 307 Temporary Redirect
до /login
, который ссылается на /user/new
.
Обновление
Я выяснил, что это плохая идея, потому что, если пользователь обновляет страницу, которая была отображена как ответ для POST /user
, они повторно отправляют данные сообщения. Я оставлю ответ здесь, если у кого-то еще будет такая же блестящая идея.