- Post-Redirect-Get
-
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, 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
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 : au lieu de directement retourner une page, la requête POST retourne un 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'utisateur 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.
Wikimedia Foundation. 2010.