HTTP方法GET、POST、PUT和DELETE有什么区别?

53

我正在开发REST WCF服务,理论上我知道何时选择什么目的。

  • GET用于获取资源
  • PUT用于更新
  • POST用于插入
  • DELETE用于删除

但是如果我们不遵循上述规则,例如用GET方法插入记录,会有什么缺点呢?


2
你想这样做的原因是什么? - Michael Petrotta
4
我不知道为什么我们应该遵循上述规则,如果我们不遵循它会有什么缺点? - Fooker
1
惯例。可预测性。为什么你应该在道路的左侧行驶(在美国是右侧)? - Michael Petrotta
1
@Seer 使用 GETS 来更改数据会使 CSRF 攻击者稍微容易一些。当然,这并不意味着 POST/PUT 本质上是安全的,它们仍然需要通过令牌来保护以防止 CSRF 攻击。 - eoghank
啊,我明白了,现在这样就有意义多了。我的论文有更多的研究课题了!谢谢。 - Seer
显示剩余3条评论
3个回答

54
由于HTTP GET方法被指定为幂等的,因此按规范进行的GET请求可以再次提交而不会更改服务器上的任何内容。但是,按规范进行的HTTP POST请求可能会更改运行在服务器上的应用程序的状态,这不适用于HTTP GET请求。
因此,按规范进行的HTTP GET请求可以多次针对某个页面执行,而无需担心更改其状态。
不遵守规范可能会产生各种不良后果。例如,Web爬虫会跟随GET请求索引站点,但不会跟随POST请求。如果允许HTTP GET请求更改数据库中的数据,则可以轻松理解它所带来的不良影响。
遵守规范就像尊重您的服务或网站与各种消费者之间的协议一样,这些消费者可以是普通用户的浏览器,也可以是像Web爬虫这样的其他服务。
您可以构建一个使用GET请求插入记录的站点,但是您还应该期望围绕站点构建的任何内容都基于您遵守协议的假设而运作。
最后一个例子是,当用户尝试刷新由HTTP POST请求到达的页面时,Web浏览器会发出警告,警告可能会重新提交某些数据。如果页面是通过HTTP GET请求到达的,则在浏览器中没有内置的此类保护层。
您可以在此处阅读更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html


11
但是,如果我们不遵循这个规则并使用GET 方法插入记录,会有什么缺点呢?
搜索引擎使用GET请求访问你的页面,因此如果你使用GET方法插入记录,Google的爬虫可能会插入你不想要的记录。
通常情况下,人们会在任何一种ajax请求中使用POST方法,并将实际动作放在请求的主体中。这样做没有太大的问题,但该功能是供你使用的,所以你最好使用它。

6
我曾面临过这样的情况,我本应该使用PUT而不是GET。我进行了一个权限插入调用,向第三方(Google)发送请求。我发起了一个Ajax GET请求,将更新权限的调用发送到我的Servlet,然后调用去了外部服务。外部服务花费了相当长的时间来完成请求。在此期间,我在我的服务器日志中看到了同一权限调用的重复。由于这是一个GET请求,浏览器可以无限次地调用服务器,所以它一直在调用服务器问是否已经完成。浏览器遵循标准,但我的代码没有遵循标准。我没有按照标准来解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接