41

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

我已经通过这个网站和网络梳理了几个小时,除了“这里的概念”之外找不到任何东西。

如何理解发布/重定向/获取模式?

4

5 回答 5

85

维基百科很好地解释了这一点

问题

问题

解决方案

解决方案

于 2013-01-30T13:11:26.623 回答
32

从您的研究中您可能知道,POST-redirect-GET看起来像这样:

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

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

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

/posts它本身与这个特定的模式并没有真正的关系,所以我会忽略它。

/posts/<id>可以这样实现:

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

/posts/create可以这样实现:

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

我会试着解释一下。也许不同的观点对你有用。

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

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

PRG 是 POST 和 GET 的组合,它们将各自用于各自的用途。

于 2012-05-31T04:00:22.433 回答
4

只是为了让人们可以看到一个代码示例(这是使用 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),会停止重新提交该表单。

于 2020-04-01T10:06:15.690 回答
1

这都是一个概念问题,没有更多要理解的:

  • POST 是让客户端向服务器发送数据
  • GET用于客户端向服务器请求数据

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

于 2020-04-01T10:43:33.353 回答