Patrons de conception/Post-Redirect-Get


Le patron de conception Post-Redirect-Get (PRG) est une solution spécifique au protocole HTTP pour le développement de serveur web.

Patron de conception
Catégorie : Autre
Nom français : Post-Redirect-Get
Nom anglais : Post-Redirect-Get
Éviter la soumission multiple d'un formulaire web lors d'un rafraîchissement

Quand un utilisateur soumet un formulaire web (exemples : une commande, une souscription, une nouvelle version de page wiki) dont l'envoi est de type POST, le navigateur l'envoie avec la méthode POST, et reçoit une confirmation du serveur après traitement de la requête et du formulaire.

Le problème

modifier
Sans utilisation du patron de conception, les échanges sont les suivants (seule la première ligne est montrée) :
  • L'utilisateur envoi le formulaire (bouton Submit, OK, ...)
  • Client -> Serveur : envoi du formulaire
POST ...
  • Le serveur traite le formulaire
  • Serveur -> Client : envoi de la page de confirmation
HTTP/1.0 200 OK
  • Le client affiche la page qu'il vient de recevoir, et l'utilisateur décide de rafraîchir la page.
  • Donc le navigateur répète la même requête POST.
  • Client -> Serveur : ré-envoi du formulaire (donc nouveau traitement par le serveur)
POST ...
 
Diagramme d'un problème de multiple soumission.

La soumission multiple du formulaire peut avoir des effets indésirables dont notamment le renouvellement de l'achat d'un article.

La solution

modifier
Ce problème est résolu côté serveur en répondant par une redirection :
  • L'utilisateur envoi le formulaire (bouton Submit, OK, ...)
  • Client -> Serveur : envoi du formulaire
POST ...
  • Le serveur traite le formulaire
  • Serveur -> Client : redirection vers la page de confirmation
HTTP/1.0 303 See Other
  • Client -> Serveur : demande avec la nouvelle URL de la page de confirmation en utilisant la méthode GET conformément à la spécification du protocole HTTP quand le client reçoit le code de réponse 303.
GET ...
  • Serveur -> Client : envoi de la page de confirmation
HTTP/1.0 200 OK
  • Le client affiche la page qu'il vient de recevoir, et l'utilisateur décide de rafraîchir la page
  • Donc le navigateur répète la même requête GET.
  • Client -> Serveur : rafraîchir sans ré-envoi du formulaire
GET ...
 
Diagramme de la résolution du problème avec le patron PRG.

Le client reçoit une redirection au lieu de la page directement en réponse de l'envoi du formulaire. Le protocole HTTP spécifie que la redirection de code 303 doit être faite avec la méthode GET, ce que fait le client aussitôt pour recevoir la page de confirmation. Si l'utilisateur rafraîchit la page, le formulaire n'est plus renvoyé car la redirection a forcé le changement de méthode à GET.

Le nom du patron de conception donne donc un résumé des premiers échanges effectués (requête POST, réponse REDIRECT, requête GET).

Consultez également ces pages dans d’autres projets Wikimedia :

Article encyclopédique sur Wikipédia.