PRGパターンとは

PRGは、Post/Redirect/Getの略で、フォーム送信後に表示されるページを再読み込み、共有、ブックマークしても、再度フォームを送信するなどの悪影響がないようにするためのウェブ開発デザインパターンのことらしい。

例えば、herokuのサンプルページ(New Article)が、PRGパターンに従っていない場合、下記のような構成になる。

image.png

上記のようなWebサイトで、POSTリクエストでサーバーに送信された場合に、サーバーのレスポンス結果に対して更新してしまうと、元のPOSTの内容が再送信され、コンテンツが二重登録される。ECサイトとかだと、Web購入が重複する等の望ましくない結果になってしまう。

一部のブラウザでは、POSTリクエストを再発行しようすると、下記のような警告をユーザーに通知してリスクを軽減している。

image.png

上記の課題への対策として、PRGパターンが採用されている。PRGパターンでは、コンテンツを応答する代わりに、サーバーはクライアントを別の場所にリダイレクトするようにPOSTリクエストに応答する。

image.png

上記のように、PRGパターンでは、サーバはPOSTリクエストに対してリダイレクトを返し、クライアントは受け取ったURIにて再度GETリクエストを出して、POSTの結果を取得することになる。これにより、クライアントが結果ページにて更新しても、GETメソッドが送られるだけのため、二重登録されることを防げる。

ただ、PRGパターンは、フォームの重複送信のすべてのシナリオに対応することはできない。例えば、サーバーの遅延が原因で最初の送信が完了する前にクライアントが更新すると、特定のクライアントで重複したPOSTが発生してしまう。

参考