После POST мне следует перенаправить 302 или 303?

Общим сценарием для веб-приложения является перенаправление после POST, который изменяет базу данных. Как перенаправление на вновь созданный объект базы данных после создания пользователем.

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

302 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3

303 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

Так что я должен использовать 302 или 303?

Ответ 1

Зависит.
303 и 307 ответов были добавлены в HTTP1.1.
Таким образом, клиентские агенты, которые строго соответствуют HTTP1.1 RFC, должны быть в порядке с ответом 303.
Но могут быть агенты, которые не полностью соответствуют или соответствуют требованиям HTTP1.0 и не смогут обрабатывать 303.
Поэтому, чтобы убедиться, что ответ вашего приложения можно обработать изящно большинством клиентских реализаций, я думаю, что 302 - самый безопасный вариант.
Выдержка из RFC-2616:

Примечание. Многие пользовательские агенты pre-HTTP/1.1 не понимаю 303       положение дел. Когда взаимодействие с такими клиентами вызывает озабоченность,       Вместо этого может использоваться код состояния 302, так как большинство агентов пользователя реагируют       к реакции 302, как описано здесь для 303.

Ответ 2

Правильный - 303.

Я использую его и не обнаружил проблем с совместимостью с UAs, новее Netscape 4 (1998, выпущен 17 лет назад).

Если вы используете 302, вы рискуете, что UA снова отправит POST на новый URL вместо перехода на GET.

Тем не менее, если вы беспокоитесь о клиентах HTTP/1.0 (которые не поддерживают vhosts и, вероятно, не смогут получить доступ к вашей странице в любом случае), вы должны включить HTML со ссылкой на новую страницу в теле 303 (такие веб-серверы, как Apache, уже это сделали).

Ответ 3

В большинстве серверных языков механизм перенаправления по умолчанию использует 302:

  • Java response.sendRedirect(..) использует 302
  • ASP.NET response.Redirect(..) использует 302
  • PHP header("Location: ..") использует 302
  • RoR redirect_to использует 302
  • и т.д..

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

Ответ 4

В теории вы (и весь мир) должны использовать 303, как вы уже отмечали. Но также большинство браузеров реагируют на 302, как будто они должны реагировать на 303. Таким образом, в целом, похоже, что не имеет значения, отправляете ли вы 302 или 303. В ссылке, которую вы указали для спецификации 303, есть интересная записка:

Примечание. Многие пользовательские агенты до HTTP/1.1 не понимают статус 303. Когда взаимодействие с такими клиентами вызывает озабоченность, вместо этого может использоваться код состояния 302, так как большинство агентов пользователя реагируют на ответ 302, как описано здесь для 303.

Важно отметить пользовательские агенты pre -HTTP/1.1, поэтому, возможно, это было важно некоторое время назад, но я не думаю, что это так.

Итак, в целом, это зависит от вас (я мог бы поспорить, что вы хотите, чтобы браузеры не изменяли свое поведение против 302 статусов никогда, из-за боязни взломать Интернет для своих пользователей).

Ответ 5

При предоставлении местоположения нового ресурса, созданного запросом POST, 201 ( "Создано" ) является подходящим ответом.

HTTP/1.1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2

Протокол публикации Atom: http://tools.ietf.org/html/rfc5023#section-5.3

Это означает, что веб-браузер, вероятно, не будет перенаправляться на новый URL; пользователь должен следовать ссылке, чтобы перейти к новому элементу (эта ссылка может быть предоставлена ​​в тексте ответа, а также в заголовке Location).