Post-Redirect-Get

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir PRG.
Diagramme d'un problème de multiple soumission.
Diagramme de la résolution du problème avec le pattern PRG.

Post-Redirect-Get ou Post/Redirect/Get (PRG), aussi nommé Redirect After Post, est un patron de conception très répandu dans la programmation web. Il permet de résoudre une partie des problèmes de multiple soumission d'un formulaire (en), ainsi que de moins perturber le fonctionnement des marque-pages et de la commande "page précédente" des navigateurs web.

Problème de multiple soumission de formulaire[modifier | modifier le code]

Lorsqu'un formulaire web est soumis à un serveur à travers une requête HTTP POST, un internaute rafraîchissant la réponse du serveur peut provoquer la resoumission de la requête HTTP POST originale, pouvant provoquer des résultats indésirables, comme la répétition d'un achat. Certains navigateurs affichent un message d'avertissement avant la resoumission du formulaire, mais rien n'empêche celle-ci d'avoir quand même lieu.

Afin d'éviter ce problème, de nombreux développeurs web emploient le pattern PRG[1] : au lieu de directement retourner une page, la requête POST retourne une en-tête (header) de redirection. Une implémentation correcte des spécifications HTTP 1.1 exige que l'application web retourne une réponse HTTP 303 dans cette situation, assurant ainsi que le navigateur peut effectuer un rafraîchissement de la page sans répéter la soumission de la requête POST.

Le pattern PRG ne permet pas de résoudre la totalité des scénarios pouvant entraîner une multiple soumission. Par exemple, le pattern PRG ne résout pas les scénarios suivants :

  • L'utilisateur revient sur la page du formulaire et soumet celui-ci à nouveau.
  • L'utilisateur clique plusieurs fois sur le bouton de soumission avant le chargement de la réponse du serveur (on peut s'en prémunir avec du JavaScript désactivant le bouton après le premier clic).
  • L'utilisateur rafraîchit la page avant que la soumission initiale soit achevée (à cause du lag du serveur), générant une requête POST supplémentaire avec certains navigateurs.

Notes et références[modifier | modifier le code]

  1. (en) Wendy Chisholm et Matt May, Universal Design for Web Applications, O'Reilly Media,‎ novembre 2008, 208 p. (ISBN 978-0-596-51873-8, présentation en ligne, lire en ligne), p. 36

Sur les autres projets Wikimedia :