关于 Http 动词感到困惑

7

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

我知道一些基本的事情,例如:

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

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


2
如果你这样做,REST警察会来敲你的门,并强迫你阅读Roy Fielding的博士论文,不仅仅是有关REST的章节。http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm - blank
4个回答

10

@archil 的解释非常好,但我想指出规则并不像你描述的那样严格(至少就协议而言)。

  • GET 必须是安全的。也就是说,GET 请求不能从根本上改变服务器状态。(服务器可以做一些额外的工作,如记录请求,但不会更新任何数据。)
  • PUT 和 DELETE 必须是幂等的。也就是说,对同一个 URI 进行多次调用与进行一次调用将产生相同的效果。例如,如果你想通过 PUT 请求将人名从 "Jon" 改为 "Jack",这是可以的,因为你可以执行一次或 100 次,人名仍将更新为 "Jack"。
  • POST 对安全性和幂等性没有任何保证。也就是说,你可以在 POST 请求中做任何你想做的事情。然而,你将失去客户端利用这些假设所带来的任何优势。例如,你可以使用 POST 进行搜索,这在语义上更接近于 GET 请求。虽然不会有任何问题,但浏览器(或代理或其他代理)永远不会缓存该搜索的结果,因为它无法假定请求后什么都没有改变。此外,网络爬虫永远不会执行 POST 请求,因为它无法假定该操作是安全的。

整个 HTML 版本的万维网没有 PUT 或 DELETE 也可以很好地运作,使用 POST 删除或更新也是完全可以的,但如果你能支持 PUT 和 DELETE 进行更新和删除(以及其他幂等操作),那么它会稍微更好,因为代理可以假定该操作是幂等的。

参见 W3C 官方文档 以了解有关安全性和幂等性的详细信息。


jhericks:接受了你的答案,因为它更好地解释了这些动词。谢谢 jhericks。 - Jaggu

4

协议就是协议。它的目的是定义与之相关的每一个规则。HTTP也是一种协议。所有的规则(包括HTTP动词规则)都是由HTTP协议定义的,并且使用方式也是由HTTP协议定义的。如果你不遵循这些规则,只有你自己能理解你的服务内部发生了什么。这将违反协议规则,并且会令其他用户感到困惑。曾经有一个例子,一个著名的照片网站(无论是哪一个)使用GET请求删除图片。当那个网站的用户安装Google桌面搜索程序时,该程序会将页面存档到本地。由于该程序知道GET操作仅用于获取数据,不应影响任何内容,因此它将向每个可用的URL(包括那些GET删除URL)发出GET请求。由于用户已登录并且cookie存储在浏览器中,因此不存在授权问题。结果是 - 所有用户的照片都被删除了,因为未正确使用HTTP协议和GET动词。这就是为什么你应该始终遵循你正在使用的协议的规则。虽然从技术上讲可能是可行的,但覆盖已定义的规则是不正确的。


2
使用GET方法删除资源就像有一个名为并记录的函数向数组添加东西,但在底层删除数组中的某些内容一样。REST只有几个明确定义的方法(HTTP动词)。您的服务的用户将期望您的服务遵循这些定义,否则它就不是RESTful web服务。

1
如果您这样做,就不能声称您的接口是符合REST原则的。REST原则要求指定的动词执行您已经提到的操作。如果它们没有执行,那么就不能称之为RESTful接口。

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