我一直在学习微软的ASP.NET MVC教程,最终到达了这个页面:
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx
该页面底部给出了以下声明:
“通常情况下,当调用修改Web应用程序状态的操作时,您不希望执行HTTP GET操作。执行删除操作时,您要执行HTTP POST操作,或者更好的做法是执行HTTP DELETE操作。”
这是真的吗?有人可以提供更详细的解释来支持这种说法吗?
Jon Skeet的回答是经典答案。但是:假设你有一个链接:
href = "\myApp\DeleteImportantData.aspx?UserID=27"
那如果 Google 爬虫访问并索引了你的页面,会发生什么呢?
GET通常没有副作用,换句话说,它不会改变状态。这意味着结果可以被缓存,书签可以安全地创建等。
实现者应该意识到,软件代表用户在他们与互联网的交互中,并且应该小心允许用户了解他们可能采取的任何行动,这些行动可能对他们自己或他人具有意外的重要性。
特别是,已经建立了GET和HEAD方法不应具有除检索之外的其他意义的约定。这些方法应该被认为是“安全”的。这允许用户代理以特殊方式表示其他方法,例如POST、PUT和DELETE,以便告知用户正在请求可能不安全的操作。
当然,无法确保服务器不会在执行GET请求的结果上产生副作用;事实上,一些动态资源认为这是一个功能。这里的重要区别是用户没有请求副作用,因此不能对其负责。
HTTP DELETE
是幂等的,但HTTP POST
不是。GET
和HEAD
除了幂等性之外还有一个额外的约定,即即使在初始应用中也不会产生副作用。请参阅http://stephenwalther.com/archive/2009/01/21/asp-net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx。 - Matthew另一个例子...
http://example.com/admin/articles/delete/2
如果您已登录并具有适当的权限,则此操作将删除文章。比如,如果您的网站允许评论,并且用户将该链接作为图片提交,那么它会像这样:<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>
当您作为管理员用户浏览站点上的评论时,浏览器将尝试通过发送到该URL的请求来获取该图像。但因为在浏览器执行此操作时您已登录,所以文章将被删除。
如果浏览器找不到图像,大多数浏览器不会显示任何内容,所以您可能甚至没有注意到。
希望这样能让您理解。
请参见我的答案。它同样适用于这个问题。
- 预取: 很多网络浏览器会使用预取,也就是在你点击链接之前加载页面,预期你稍后会点击该链接。
- 机器人: 有几种机器人会扫描和索引互联网上的信息,它们只会发出GET请求。因此,出于这个原因,您不应该从GET请求中删除任何内容。
- 缓存: GET HTTP请求不应更改状态,并且应该是幂等的。幂等意味着发出一次请求或多次请求都会产生相同的结果。即没有副作用。因此,GET HTTP请求与缓存紧密相关。
- HTTP标准如此规定: HTTP标准规定了每个HTTP方法的用途。有几个程序是基于HTTP标准构建的,它们假设您将按照规定使用它。因此,如果您不遵循规定,将会对大量随机程序产生未定义的行为。
<img src="http://yoursite/Delete/Me" />
使用 GET 方法的另一个问题是该命令会出现在浏览器的地址栏中。因此,如果您刷新页面,就会再次发出该命令,无论是“删除上一条记录”、“提交订单”或其他类似的命令。
<img src="DeleteImportantData.aspx?UserID=27">
这种东西。 - user247702