Перенаправление с созданным 201 - PullRequest
30 голосов
/ 03 января 2011

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 03 января 2011

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

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

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

(от рфк )

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

4 голосов
/ 03 января 2011

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

2 голосов
/ 03 января 2011

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

1 голос
/ 31 августа 2013

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

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

обновление

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...