对Http动词感到困惑

Jag*_*ggu 6 rest wcf http http-verbs wcf-rest

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

我知道基本的东西,比如:

Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting
Run Code Online (Sandbox Code Playgroud)

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

jhe*_*cks 10

@archil对滥用动词的陷阱有一个很好的解释,但我要指出的是规则并不像你所描述的那样严格(至少就协议而言).

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

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

有关安全性和幂等性的真正细节,请参阅W3C官方文档.