web-dev-qa-db-fra.com

Après un POST, dois-je faire une redirection 302 ou 303?

Un scénario courant pour une application Web consiste à rediriger après un POST qui modifie la base de données. Comme rediriger vers l'objet de base de données nouvellement créé après que l'utilisateur l'a créé.

Il semble que la plupart des applications Web utilisent des redirections 302, mais 303 semble être la bonne chose à faire selon les spécifications si vous souhaitez que l'URL spécifiée dans la redirection soit récupérée avec GET. Techniquement, avec un 302, le navigateur est censé récupérer l'URL spécifiée avec la même méthode que celle utilisée pour l'URL d'origine, qui serait POST. Cependant, la plupart des navigateurs ne le font pas.

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

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

Dois-je donc utiliser 302 ou 303?

51
Kyle

Dépend.
303 et 307 réponses ont été ajoutées dans HTTP1.1.
.
Mais il peut y avoir des agents qui ne sont pas entièrement conformes ou qui sont conformes à HTTP1.0 et ne seront pas en mesure de gérer le 303.
Donc, pour être sûr que la réponse de votre application peut être gérée avec élégance par la majorité des implémentations client, je pense que 302 est l'option la plus sûre.
Extrait de RFC-2616 :

Remarque: de nombreux agents utilisateurs antérieurs à HTTP/1.1 ne comprennent pas l'état 303. Lorsque l'interopérabilité avec de tels clients est une préoccupation, le code d'état 302 peut être utilisé à la place, car la plupart des agents utilisateurs réagissent à une réponse 302 comme décrit ici pour 303.

20
Cratylus

Le bon est 303.

Je l'utilise et je n'ai trouvé aucun problème de compatibilité avec les UA plus récents que Netscape 4 (1998, publié il y a 17 ans).

Si vous utilisez 302, vous risquez que UA envoie à nouveau POST vers la nouvelle URL au lieu de passer à GET.

Néanmoins, si vous vous inquiétez des clients HTTP/1.0 (qui ne prennent pas en charge les vhosts et ne seront probablement pas en mesure d'accéder à votre page de toute façon), vous devez inclure HTML avec un lien vers la nouvelle page dans le corps de la réponse 303 ( les serveurs Web comme Apache le font déjà).

57
Kornel

Dans la plupart des langues côté serveur, le mécanisme de redirection par défaut utilise 302:

  • Java response.sendRedirect(..) utilise 302
  • ASP.NET response.Redirect(..) utilise 302
  • PHP header("Location: ..") utilise 302
  • RoR redirect_to utilise 302
  • etc..

Je préfère donc cela, plutôt que de définir manuellement le statut et les en-têtes.

9
Bozho

En théorie, vous (et tout le monde) devriez utiliser 303 comme vous l'avez noté. Mais aussi, la plupart des navigateurs réagissent à un 302 comme ils devraient réagir à un 303. Donc, dans l'ensemble, il semble que cela n'a pas d'importance si vous envoyez 302 ou 303. Dans le lien que vous avez fourni pour la spécification 303, il y a une note intéressante :

Remarque: de nombreux agents utilisateurs antérieurs à HTTP/1.1 ne comprennent pas l'état 303. Lorsque l'interopérabilité avec de tels clients est une préoccupation, le code d'état 302 peut être utilisé à la place, car la plupart des agents utilisateurs réagissent à une réponse 302 comme décrit ici pour 303.

Il est important de noter les agents utilisateurs pre - HTTP/1.1, donc c'était peut-être important il y a quelque temps, mais je ne pense pas que ce soit le cas maintenant.

Donc, dans l'ensemble, cela dépend de vous (je pourrais parier ce que vous voulez que les navigateurs ne changent jamais leur comportement contre 302 statuts, de peur de casser Internet pour leurs utilisateurs).

6
Carlos Campderrós

Lorsque vous fournissez l'emplacement d'une nouvelle ressource créée par une POST, 201 ("Créé") est une réponse appropriée.

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

Protocole de publication Atom: http://tools.ietf.org/html/rfc5023#section-5.

Cela signifie cependant qu'un navigateur Web ne redirigera probablement pas vers la nouvelle URL; l'utilisateur doit suivre un lien pour accéder au nouvel élément (ce lien peut être fourni dans le corps de la réponse, ainsi que dans l'en-tête Location).

4
Alf Eaton