Post/Redirect/Get
pattern for web applications
Posted by: Michael
Jouravlev on ?? 14, 2003 DIGG
原文地址: http://www.theserverside.com/patterns/thread.tss?thread_id=20936
Being able to refresh a web page
in the web application is an important usability feature. Also it is an MVC
concept showcase: web page is a view for the underlying model, it is a window
through which a user looks at the data.
Two most popular browsers: MSIE and Netscape/Mozilla have different names for
the page refresh operation. IE uses more user-friendly "refresh",
while Netscape uses more technical "reload". I prefer
"reload" as a more correct term, but in fact both reload and refresh
operations take place when a user tries to renew the page in the browser.
Very often a user is completely unaware that browser resends information to the
server during page reload. Even if a browser warns user that information should
be resent to the server, a user often cannot understand the technical meaning
of the warning. Let us trace what happens during standard form submission
process.
* The first page containing an input form could be obtained from the server
using either GET or POST. If GET was used, then a user can refresh this page
without seeing nagging "Information must be resend" message. Still,
if this GET has attached parameters, they would be resent to the server.
* After a user fills out the form, it is submitted to the server. POST method
is usually used for sending forms.
* Server responds with a result page.
The result page may look completely innocent, with no forms or any active
elements, just some boring results from the database. For anyone remote from
the internet development it seems completely legal and easy to refresh this
page. Most people think that word "refresh" means exactly what it
sounds: reload the page with its data from the server.
But in fact to refresh the result page would mean to re-issue the same request
to the server which was used to obtain the page at the first place. That means,
to do the whole POST of the form from the first page again. Here is where a
user sees the "Information must be resend" message. Resending of the
information may produce unwanted or inconsistent modifications of underlying
data. Thus, these form resubmits must be properly handled by controller and
model.
Now we are getting to the problem: because browser needs to resend the whole
original request to obtain the result page, the refresh operation is not really
MVC-compliant because user data is sent to the server. The solution of problem
is quite simple – redirection.
This technique is actually pretty well known, but it is not standard yet for
"after-post" results, and it does not have a well-known name. I call
it "PRG request pattern", because it consists of three major parts:
Post, Redirect and Get. The first one actually is not necessarily a POST, it is
just that POST is most often used to send user data to the server. The last one
must be GET so user would not see nagging messages. PRG request works in two
stages:
* First a user-filled form is sent to the server using either POST or GET
method. Server stores the information, updates the database and business model
data, and replies with REDIRECT response for a View page.
* Browser loads View using GET, no user data is sent to the server at this
point.
Now we have a clean MVC solution. When a user tries to refresh a result page,
browser resends to the server "empty" GET request. All needed data is
already on the server, so server just fills it in the page and sends back to
the user.
What about back button? This works too, it returns us one step backwards, to
the page with a form. This form can be refreshed as well. If it was obtained
using GET, then user would not see warning message.
Page refresh works perfectly with redirection. We have to do the roundtrip to
the browser, but one more second spent for redirection means little for
interactive applications.
The only thing that have to be dealt with is intentional form resubmitting
which happens when a user returns to the first page using Back button and
submits form again. This should be checked by controller and a model and is out
of scope of this pattern.
Bottom line: the PRG pattern provides the following benefits:
* it separates the View from Model updates;
* result page refresh does not cause form resubmit;
* page refresh is done using GET, so no messages are shown to a user
分享到:
相关推荐
http协议是互联网上应用最为广泛的一种网络协议,他在接口中扮演着重要的角色,Post/Get请求,想必大家都有所耳闻,我们一起利用Boost::Asio库来实现Post/Get请求的发送。 VS2013 文章地址:...
1 支持POST/PUT/GET/DELETE等请求; 2 支持一键生成并导出文档; 3 不比老外的的postman差。
50行代码http发送Post/Get请求,直接在linux gcc编译即可使用,或在win下任意c/c++编译器都可
支持POST/GET方法,界面简洁,容易操作!
java发送http/https请求(get/post)代码,java 通过发送json,post请求,返回json数据的方法 java 通过发送json,post请求,返回json数据的方法
Golang: 接收GET和POST参数 GET 和 POST 是我们最常用的两种请求方式,今天讲一讲如何在 golang 服务中,正确接收这两种请求的参数信息。 处理GET请求 1.1 接收GET请求 //接收GET请求 func Get(writer ...
主要实现HTTP POST/GET/PUT/DELETE等基本操作方式,此外还实现了代理、Header读取、HTML解析特定标签的属性值。
Post,Get请求测试工具,文档中有详细的使用说明!
c# 运用get/post 和使用webservicec# 运用get/post 和使用webservicec# 运用get/post 和使用webservicec# 运用get/post 和使用webservice
封装https/http的get/post使用函数DLL文件,方便使用者调用,有调用示例程序;另外还有两个ansi与Utf8的转换, 调用示例: PostHttpsContext("current.sinaapp.com","/post.php","name=rain&age=12"); 调用示例: ...
博客:【安卓学习之工具学习】网络通信测试工具-socket/post/get 的附件,博客连接为:http://blog.csdn.net/ljb568838953/article/details/52493675 附件里面含: fiddlersetup_v4.6.2.0.32002.exe NetAssist_v4.2....
http post/get请求所需的jar包,附带post请求源码样例
.net 后台Post,get方式调用webapi,包括上传文件
利用Boost::Asio库来实现Post/Get请求的发送。可以快速开发c++的http请求,访问以http为协议的服务器示例代码。
测试接口,模拟POST,GET,PUT,DELETE提交的工具
Qt http同步请求测试(restfull中常用的get/post/put/delete、文件上传/下载) 示例源码 https://blog.csdn.net/aggs1990/article/details/124104548 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下
http模拟发送器(Post/Get),(可执行jar文件)
框架主要包括:Get请求、Post请求、文件上传、文件下载。效果图及讲解见:https://blog.csdn.net/ahuyangdong/article/details/82760382。github源码:https://github.com/ahuyangdong/RetrofitFrame
用HTML页面模拟测试get/post请求,psot请求参数的格式为json串
玩过抓包,网络协议分析的朋友肯定都知道http https post get,web端和用户的交互主要是通过post get完成的。 我这里有两种实现: 1:libcurl实现的CHttpClient类,该类实现了Htpp和Https的get post方法。 2:...