Подтвердить что ты не робот

Перенаправление с созданным 201

Есть ли способ перенаправить ответ через 201?

RFC указывает, что вновь созданный ресурс должен быть указан в заголовке Location, и я его определяю. Я предположил, что браузер перенаправит, но это не так, даже если на странице нет контента.

Я хочу, чтобы пользователь после действия POST перенаправлялся на новый ресурс. Поэтому я искушаюсь использовать 303 See Other, но 201 кажется более подходящим.

Итак, есть ли способ автоматически перенаправить популярные браузеры без вмешательства пользователя и не полагаться на Javascript?

4b9b3361

Ответ 1

Я думаю, вы смешиваете два разных семантических ответа - один говорит клиенту, что вы успешно создали ресурс и где он. Приходит ли клиент для его получения или нет, это совсем другая история.

Второй сообщает клиенту, что он отправил неправильный URI адреса для запрашиваемого ресурса - и что он должен повторить попытку, но с другим URI.

A 303 подходит в этом случае - на самом деле, он явно рекомендовал для этого:

(из rfc)

Он в основном используется, чтобы позволить выходу действия POST перенаправлять пользовательский агент на выбранный ресурс, поскольку при этом предоставляется информация, соответствующая ответу POST, в форме, которая может быть отдельно идентифицирована, закладована и кэширована, независимо от первоначального запроса.

Ответ 2

Браузер примет действие перенаправления через один из кодов состояния 3xx, спецификация не определяет, что пользовательский агент должен перенаправлять с помощью 201. Вы можете попробовать отправить заголовок обновления, чтобы увидеть если он перенаправляет на заголовок Location, но я не буду рассчитывать на него. Почему бы не придерживаться ответа 3xx?

Ответ 3

Вы можете отправить заголовок Refresh.

Ответ 4

Я имею дело с этим в первый раз, и это то, что я решил сделать:

  • GET /user/new200 Ok с регистрационной формой пользователя.
  • POST /user201 Created новый пользователь отвечает тем же контентом, что и маршрут GET /user.
  • GET /user200 Ok на странице профиля пользователя для аутентифицированного пользователя или для анонимных посетителей 307 Temporary Redirect до /login, который ссылается на /user/new.

Обновление

Я выяснил, что это плохая идея, потому что, если пользователь обновляет страницу, которая была отображена как ответ для POST /user, они повторно отправляют данные сообщения. Я оставлю ответ здесь, если у кого-то еще будет такая же блестящая идея.