对Http动词感到困惑

时间:2011-08-01 08:12:42

标签: wcf http rest wcf-rest httpverbs

我很困惑你何时以及为什么要在REST中使用特定动词?

我知道基本的事情:

Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting

这些属性是按照我上面写的操作使用的,但我不明白为什么? 如果在REST中的Get方法内部我会添加一个新实体或在POST内部更新一个实体会发生什么?或者可能在DELETE里面我添加一个实体。我知道这可能是一个noob问题,但我需要了解它。这对我来说听起来很混乱。

4 个答案:

答案 0 :(得分:10)

@archil has an excellent explanation滥用动词的陷阱,但我会指出规则并不像你所描述的那样严格(至少就协议而言)。

  • 必须安全。这意味着GET请求不得以任何实质性方式更改服务器状态。 (服务器可以执行一些额外的工作,例如记录请求,但不会更新任何数据。)
  • PUT和DELETE必须是幂等的。这意味着对同一URI的多次调用将与一次调用具有相同的效果。因此,例如,如果你想将一个人的名字从“Jon”改为“Jack”而你是用PUT请求做的,那就没关系,因为你可以做一次或100次,而且这个人的名字仍然会被更新“杰克”。
  • POST不保证安全性或幂等性。这意味着您可以通过POST请求在技术上做任何您想做的事情。但是,您将失去客户可以采取这些假设的任何优势。例如,您可以使用POST进行搜索,这在语义上更像是GET请求。不存在任何问题,但浏览器(或代理或其他代理)永远不会缓存该搜索的结果,因为它不能假设由于请求而没有任何改变。此外,Web爬虫永远不会执行POST请求,因为它无法假定操作是安全的。

万维网的整个HTML版本相当顺利,没有PUT或DELETE,使用POST进行删除或更新完全没问题,但是如果你可以支持PUT和DELETE进行更新和删除(以及其他幂等操作)它只是好一点,因为代理可以假设操作是幂等的。

请参阅official W3C documentation了解有关安全性和幂等性的真实细节。

答案 1 :(得分:4)

协议是协议。它旨在定义与之相关的每个规则。 Http也是协议。以上所有规则(包括http动词规则)均由http协议定义,其用法由http协议定义。如果您不遵守这些规则,则只有您了解服务中发生的情况。它不会遵循协议规则,并且会让其他用户感到困惑。关于使用GET请求删除图片的着名照片网站(无关紧要)有一个例子。一旦该网站的用户安装了谷歌桌面搜索程序,就可以在本地获取页面。由于该程序知道GET操作仅用于获取数据,并且不应影响任何内容,因此它对每个可用URL(包括那些GET-delete URL)发出GET请求。当用户登录并且cookie在浏览器中时,没有授权问题。结果 - 由于http协议和GET动词的使用不正确,所有用户照片都在服务器上删除了。这就是为什么你应该始终遵循你正在使用的协议规则。虽然技术上可行,但是覆盖定义的规则是不对的。

答案 2 :(得分:2)

使用GET删除资源就像拥有一个命名和记录的函数,以向数组中添加一些东西,从数组中删除某些内容。 REST只有一些定义良好的方法(HTTP动词)。您服务的用户希望您的服务坚持这些定义,否则它不是RESTful Web服务。

答案 3 :(得分:1)

如果您这样做,则无法声称您的界面是RESTful。 REST原则要求指定的动词执行您提到的操作。如果他们不这样做,那么它就不能称为RESTful接口。