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 soumissions multiples 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 soumissions multiples 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 réémission 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 le ré-envoi 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 un 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 des soumissions multiples. 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 délai de réponse du serveur), générant une requête POST supplémentaire avec certains navigateurs.
Notes et références
- (en) Wendy Chisholm et Matt May, Universal Design for Web Applications : Web Applications That Reach Everyone, O'Reilly Media, , 208 p. (ISBN 978-0-596-51873-8, présentation en ligne, lire en ligne), p. 36