7

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

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

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

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

4

4 回答 4

10

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

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

The entire HTML version of the world wide web gets along pretty well without PUT or DELETE and it's perfectly fine to do deletes or updates with POST, but if you can support PUT and DELETE for updates and deletes (and other idempotent operations) it's just a little better because agents can assume that the operation is idempotent.

See the official W3C documentation for the real nitty gritty on safety and idempotency.

于 2011-08-01T19:29:09.710 回答
4

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

于 2011-08-01T08:42:59.367 回答
2

使用 GET 删除资源就像有一个命名和记录的函数来添加一些东西到一个数组中,该数组从引擎盖下的数组中删除一些东西。REST 只有几个定义明确的方法(HTTP 动词)。您的服务的用户会期望您的服务遵守这些定义,否则它不是 RESTful Web 服务。

于 2011-08-01T10:16:23.877 回答
1

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

于 2011-08-01T08:16:04.623 回答