2011-01-03 1 views
27

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

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

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

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

ответ

18

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

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

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

(от rfc)

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

+5

«Второе говорит клиенту, что он отправил неправильный URI адреса для ресурса, который он запрашивает», только если метод запроса был GET. Иногда это законно POST для ресурса, и он создает новый под-ресурс с другим URI. –

2

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

4

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

1

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

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

обновление

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

+2

Спасибо, что оставил это обновление. Я думал по тому же пути, и вы, вероятно, просто спасли мне кучу работы. – rmeador