理解“post / redirect / get”模式

时间:2012-05-31 03:56:38

标签: php html forms session post-redirect-get

我很难理解“发布/重定向/获取”的确切过程。

我已经梳理了几个小时的网站和网页,除了“这就是概念”之外找不到任何其他内容。

如何理解帖子/重定向/获取模式?

5 个答案:

答案 0 :(得分:41)

Wikipedia很好地解释了这个

问题

The Problem

解决方案

The Solution

答案 1 :(得分:20)

您可能从research了解到,POST - 重定向 - GET如下所示:

  • 客户端获取带有表单的页面。
  • 表单POST到服务器。
  • 服务器执行操作,然后重定向到另一个页面。
  • 客户端遵循重定向。

例如,假设我们有这个网站结构:

  • /posts(显示帖子列表和“添加帖子”的链接)
    • /<id>(查看特定帖子)
    • /create(如果使用GET方法请求,则返回表单发布给自己;如果是POST请求,则创建帖子并重定向到/<id>端点)

/posts本身与这种特定模式并不真正相关,所以我会将其排除在外。

/posts/<id>可能会像这样实现:

  • 在数据库中查找具有该ID的帖子。
  • 使用该帖子的内容呈现模板。

/posts/create可能会像这样实现:

  • 如果请求是GET请求:
    • 显示一个空表单,目标设置为自身,方法设置为POST
  • 如果请求是POST请求:
    • 验证字段。
    • 如果存在无效字段,请再次显示表单并显示错误。
    • 否则,如果所有字段都有效:
      • 将帖子添加到数据库中。
      • 重定向到/posts/<id>(从调用数据库返回<id>

答案 2 :(得分:6)

我会尝试解释它。也许不同的观点可以帮到你。

使用PRG,浏览器最终会发出两个请求。第一个请求是POST请求,通常用于修改数据。服务器响应响应中的Location标头,并且正文中没有HTML。这会导致浏览器重定向到新URL。然后,浏览器向新URL发出GET请求,该URL响应浏览器呈现的HTML内容。

我会尝试解释为什么要使用PRG。 GET方法永远不应该修改数据。当用户单击链接时,浏览器或代理服务器可能会返回缓存的响应,而不会将请求发送到服务器;这意味着当您想要修改数据时,不会修改数据。此外,POST请求不应该用于返回数据,因为如果用户想要获取数据的新副本,则他们被迫重新执行请求,这将使服务器再次修改数据。这就是为什么浏览器会给你一个模糊的对话框,询问你是否确定要重新发送请求,并可能再次修改数据或再次发送电子邮件。

PRG是POST和GET的组合,它们分别用于它们的用途。

答案 3 :(得分:2)

人们可以看到一个代码示例(这是使用express的):

app.post('/data', function(req, res) {
  data = req.body;  //do stuff with data
  res.redirect('public/db.html');
});

为了明确起见,它会立即刷新网页,并在刷新该网页(例如,如果您更新了该元素)时不会重新发布表单数据。

我的代码过去通常是这样的:

app.post('/data', function(req, res) {
   data = req.body;
   res.sendFile('public/db.html');
});

因此,这里的响应是在/ data地址发送html文件。因此,在地址栏中,按下提交按钮后,它将对我说:localhost:8080/data。 但这意味着刷新该页面后,如果您刚刚提交了表单,它将再次提交。而且您不希望同一表单在数据库中提交两次。因此,将其重定向到网页( res.redirect )而不是发送文件( res.sendFile ),将停止重新提交该表格。

答案 4 :(得分:0)

这完全是一个概念问题,没有更多要了解的内容:

  • POST用于客户端将数据发送到服务器
  • GET用于客户端从服务器请求数据

因此,从概念上讲,服务器没有必要在POST请求中回答资源数据,这就是为什么存在重定向到已创建/更新的(通常)相同资源的原因。因此,如果POST成功,则服务器会认为客户端希望获取新数据,从而通知其对它进行GET。