Asp.net mvc 为什么要使用HTTP POST或delete而不是GET进行删除?

Asp.net mvc 为什么要使用HTTP POST或delete而不是GET进行删除?,asp.net-mvc,http,http-delete,Asp.net Mvc,Http,Http Delete,我一直在阅读微软的ASP.NETMVC教程,最后来到了这个页面 本页底部有以下声明: 通常,在调用修改web应用程序状态的操作时,您不希望执行HTTP GET操作。执行删除操作时,您希望执行HTTP POST,或者更好的是,执行HTTP删除操作 这是真的吗?有人能更详细地解释这一说法背后的理由吗 编辑 声明如下: 某些方法(例如,HEAD、GET、OPTIONS和TRACE)被定义为安全的,这意味着它们仅用于信息检索,不应更改服务器的状态 相比之下,POST、PUT和DELETE等方法用于可能

我一直在阅读微软的ASP.NETMVC教程,最后来到了这个页面

本页底部有以下声明:

通常,在调用修改web应用程序状态的操作时,您不希望执行HTTP GET操作。执行删除操作时,您希望执行HTTP POST,或者更好的是,执行HTTP删除操作

这是真的吗?有人能更详细地解释这一说法背后的理由吗

编辑 声明如下:

某些方法(例如,HEAD、GET、OPTIONS和TRACE)被定义为安全的,这意味着它们仅用于信息检索,不应更改服务器的状态

相比之下,POST、PUT和DELETE等方法用于可能对服务器产生副作用的操作


GET通常没有副作用——换句话说,它不会改变状态。这意味着结果可以缓存,书签可以安全制作等等

实现者应该意识到 软件代表用户在他们的 互联网上的互动,以及 应注意允许用户 注意他们可能采取的任何行动 采取可能发生意外的行动 对自己或他人的意义

特别是,该公约得到了批准 确定了得到和头 方法不应具有 采取其他行动的意义 而不是检索。这些方法应该 被认为是“安全的”。这允许用户 代表其他方法的代理, 例如,在 特殊的方式,使用户 意识到一个事实 正在请求不安全的操作

当然,这是不可能的 请确保服务器不运行 由于以下原因产生副作用: 执行GET请求;事实上 一些动态资源认为 特色。重要区别 这里是用户没有请求的 副作用,所以不能 要对他们负责


除了关于幂等的纯粹主义问题外,还有一个实用的方面:蜘蛛/机器人/爬虫等将跟随超链接。如果你有你的“删除”操作作为一个超链接,并没有得到,那么谷歌可以愉快地删除你的所有数据。见“”

对于帖子,这不是一个风险。

。这同样适用于这个问题

  • 预取:许多web浏览器将使用预取。也就是说 它将在您之前加载一个页面 点击链接。预料到 稍后您将单击该链接
  • 机器人程序:有几个机器人程序可以扫描互联网并为其编制索引 信息。他们只会发一张支票 请求。您不想删除 这是一个GET请求 原因
  • 缓存:获取HTTP请求不应该更改状态,它们应该是幂等的。幂等的意思是 发出一次请求,或发出请求 多次都会得到相同的结果。 也就是说,没有副作用。对于 这就是GET HTTP请求的原因 与缓存紧密相连
  • HTTP标准如此规定:HTTP标准规定了每个HTTP方法是什么 对于有几个程序是为了 使用HTTP标准,他们假设 你将以你现在的方式使用它 应该是的。所以你会有 一系列错误导致的未定义行为 如果你不跟随,随机程序
关于此主题(HTTP方法的使用),我建议您阅读以下博文:


这实际上是相反的问题:为什么不在没有数据更改的情况下使用POST呢

Jon Skeet的答案是标准答案。但是:假设您有一个链接:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

谷歌机器人出现并索引你的页面?接下来会发生什么?

GET的另一个问题是,该命令会转到浏览器的地址栏。因此,如果刷新页面,您将再次发出命令,可以是“删除最后的内容”、“提交订单”或类似命令。

除了爬行器和请求必须是幂等的之外,get请求还存在安全问题。有人可以轻松地向您的用户发送电子邮件

<img src="http://yoursite/Delete/Me" />


在文本中,浏览器将很高兴地继续并尝试访问资源。使用POST并不能解决这类问题(因为你可以很容易地用javascript编写表单POST),但这是一个很好的开始。

假设我们有一个网上银行应用程序,我们可以访问转账页面。登录用户选择将10美元转账到另一个帐户

单击submit按钮(作为GET请求)重定向到

但是internet连接很慢和/或服务器很忙,因此在点击提交按钮后,新页面的加载速度很慢

用户感到沮丧,开始猛烈地点击F5(刷新页面)。猜猜会发生什么?可能会发生多次转账,清空用户帐户


现在,如果请求是以POST(或GET以外的任何方式)的形式发出的,则用户将使浏览器轻轻询问“您确定要这样做吗?它可能会产生副作用[bla bla]…”

另一个示例

http://example.com/admin/articles/delete/2
如果您已登录并具有正确的权限,此操作将删除该文章。例如,如果您的站点接受评论,并且用户将该链接作为图像提交;像这样:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

然后,当您自己作为管理员用户来浏览站点上的评论时,浏览器将尝试通过向该URL发送请求来获取该图像。但是,由于您是在浏览器进行此操作时登录的,因此文章将被删除

如果不查看源代码,您甚至可能不会注意到,因为如果找不到图像,大多数浏览器都不会显示任何内容

希望这是有意义的。

除了