REST:当我们可以在两者中实现相同的功能时,GET 和 DELETE 有啥区别?

Posted

技术标签:

【中文标题】REST:当我们可以在两者中实现相同的功能时,GET 和 DELETE 有啥区别?【英文标题】:REST: What is difference between GET and DELETE, when we can implement same functionality in both?REST:当我们可以在两者中实现相同的功能时,GET 和 DELETE 有什么区别? 【发布时间】:2016-10-28 04:26:58 【问题描述】:

在 REST Web 服务中,我们有 GET 和 DELETE 方法。

通常我们读 GET 是从服务器获取数据,如“getCountriesName”,而 DELETE 用于调用删除特定对象的资源,如“removeOrganization”。

但如果我对“getCountriesName”实施 DELETE,那么它会成功返回国家/地区名称。

那么两者有何不同?任何实时场景?

【问题讨论】:

这似乎是一个糟糕的实现。从技术上讲这是可能的,但会很混乱,这就是“约束”存在的原因。 【参考方案1】:

这在技术上是可行的,但如果你这样做,那么你就没有遵循 REST 标准。我建议使用 delete 删除资源并查询它们

【讨论】:

所以它只是关于遵循标准。这只有区别吗?从技术上讲,使用它们中的任何一个都是一样的吗? 是的。它在技术上是相同的。但是,如果您使用标准,每个人都会知道如何调用您的 API,而无需检查任何文档。因此,它在公开 API 的情况下很有用【参考方案2】:

看看Richardson Maturity Model,如果你的目标是至少达到REST的2级,你最终会得到资源(Country)和HTTP VERBS

GET /api/countries/id

这也将返回国家名称,以及其他参数。 您也可以向相同的URL 发出DELETE 请求,前提是有一个支持此功能的端点 - 在后端,您通常会拥有允许在其上使用特定HTTP VERB 的方法。实现的细节取决于您使用的语言,例如在C# 中,您将拥有一个签名基本相同但属性不同的方法,例如[HttpDelete])。

从方法(getCountriesName/removeOrganization)的角度思考根本不是 RESTful,而是 SOAP/RPC。

【讨论】:

这两个只是示例,但问题是 DELETE 与 GET 有何不同?如果两者的实现相同? 如果两者的实现是相同的,那一定是某种错误;在 GET 方法中,您通常会通过提供的 ID 检索对象/资源,而在 DELETE 方法中,您可能会在开始时执行相同的操作,然后从数据库中删除它/软删除它(更新一些某种状态)【参考方案3】:

您的服务如何处理请求完全取决于您。您基本上可以在接收GET 请求时创建新资源或使用OPTION 删除内容,但我强烈建议不要这样做,因为这不符合支持协议(在此特定情况下为 HTTP),因此违反了基本 REST约束。进一步注意,RESTful 服务应始终为adhere to and respect the supported protocols。

根据RFC 7231,GETDELETE 之间的主要区别之一是后者从给定资源及其功能中删除了关联,并且返回的响应不可缓存。这可能会或可能不会物理删除数据,但对连续的DELETEGET 操作的影响是,删除的资源不应进一步获得。无论之前的任何请求如何,都会向服务器发出连续的DELETE 请求。如果该资源之前已被删除,如果在同一资源的两次删除操作之间没有创建新资源,则服务应通过 propper 404 Not Found 错误响应通知客户端。

GET 响应,另一方面,是可缓存的,因此可以通过直接从(代理)缓存返回先前请求的结果而不是向服务器发出请求来节省服务器上的工作。这可以通过适当的缓存头设置进行细粒度。

【讨论】:

【参考方案4】:

要使用的 HTTP 方法的类型更多的是一种约定和一种要遵循的做法。当 API 暴露给外部系统时,这会给出错误的信息

详情请参阅blog post

【讨论】:

以上是关于REST:当我们可以在两者中实现相同的功能时,GET 和 DELETE 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在进销存软件中实现来电弹屏

在unity中实现分页滚动的效果和吸附功能(UGUI)

在 REST 服务中实现方法 OPTIONS 的最佳方式

使用 C# REST API 从 TFS 获取用户身份

如何在 Rails 应用程序中实现 Paypal Rest API

如何在我的 iOS 应用程序中实现该功能?