对 Http 动词感到困惑
Posted
技术标签:
【中文标题】对 Http 动词感到困惑【英文标题】:Confused about Http verbs 【发布时间】:2011-10-17 06:23:46 【问题描述】:我很困惑何时以及为什么应该在 REST 中使用特定动词?
我知道以下基本知识:
Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting
这些属性要按照我上面写的操作来使用,但我不明白为什么? 如果在 REST 中的 Get 方法中添加新实体或在 POST 中更新实体,会发生什么情况?或者可能在 DELETE 里面添加一个实体。我知道这可能是一个菜鸟问题,但我需要理解它。这听起来让我很困惑。
【问题讨论】:
如果你这样做,REST 警察会敲你的门,让你阅读 Roy Fielding 的博士论文,而不仅仅是关于 REST 的章节。 ics.uci.edu/~fielding/pubs/dissertation/top.htm 【参考方案1】:@archil has an excellent explanation 误用动词的陷阱,但我要指出的是,规则并不像您描述的那样严格(至少就协议而言)。
GET 必须是安全的。这意味着 GET 请求不得以任何实质性方式更改服务器状态。 (服务器可以做一些额外的工作,比如记录请求,但不会更新任何数据。) PUT 和 DELETE 必须是幂等的。这意味着对同一 URI 的多次调用将与一次调用具有相同的效果。例如,如果您想将一个人的姓名从“Jon”更改为“Jack”,并且使用 PUT 请求进行更改,那没关系,因为您可以这样做一次或 100 次,并且该人的姓名仍然会更新给“杰克”。 POST 不保证安全性或幂等性。这意味着您可以通过 POST 请求在技术上做任何您想做的事情。但是,您将失去客户可以利用这些假设的任何优势。例如,您可以使用 POST 进行搜索,这在语义上更像是一个 GET 请求。不会有任何问题,但浏览器(或代理或其他代理)永远不会缓存该搜索的结果,因为它不能假设请求没有任何改变。此外,网络爬虫永远不会执行 POST 请求,因为它无法假设操作是安全的。万维网的整个 html 版本在没有 PUT 或 DELETE 的情况下运行良好,使用 POST 进行删除或更新也很好,但如果您可以支持 PUT 和 DELETE 进行更新和删除(以及其他幂等操作)它只是稍微好一点,因为代理可以假设操作是幂等的。
请参阅official W3C documentation,了解有关安全性和幂等性的真正细节。
【讨论】:
jhericks:接受您的答案,因为它更好地解释了动词。谢谢 jhericks【参考方案2】:协议就是协议。它旨在定义与之相关的每个规则。 Http也是协议。以上所有规则(包括http动词规则)均由http协议定义,用法由http协议定义。如果你不遵守这些规则,只有你自己会明白你的服务内部发生了什么。它不会遵循协议的规则,并且会使其他用户感到困惑。曾经有一个例子,关于著名的照片网站(不管哪个)确实使用 GET 请求删除了图片。一旦该站点的用户安装了谷歌桌面搜索程序,该程序就会在本地归档页面。由于该程序知道 GET 操作仅用于获取数据,并且不应影响任何内容,因此它向每个可用的 url(包括那些 GET-delete url)发出 GET 请求。由于用户已登录并且 cookie 在浏览器中,因此没有授权问题。结果 - 由于 http 协议和 GET 动词的不正确使用,服务器上的所有用户照片都被删除了。这就是为什么您应该始终遵循您正在使用的协议规则的原因。尽管在技术上是可行的,但覆盖已定义的规则是不正确的。
【讨论】:
【参考方案3】:使用 GET 删除资源就像有一个命名并记录的函数向数组中添加一些内容,该数组在后台从数组中删除某些内容。 REST 只有几个定义明确的方法(HTTP 动词)。您的服务的用户会期望您的服务遵守这些定义,否则它就不是 RESTful Web 服务。
【讨论】:
【参考方案4】:如果您这样做,则不能声称您的界面是 RESTful。 REST 原则要求指定的动词执行您提到的操作。如果他们不这样做,那么它就不能称为 RESTful 接口。
【讨论】:
以上是关于对 Http 动词感到困惑的主要内容,如果未能解决你的问题,请参考以下文章