【问题标题】:Can we pass parameters to HTTP DELETE api我们可以将参数传递给 HTTP DELETE api
【发布时间】:2020-10-07 03:43:50
【问题描述】:

我有一个可以删除资源的 API (DELETE /resources/{resourceId})

上面的 API 只能告诉我们删除资源。现在我想为其他用例扩展 API,例如在删除或删除该资源的其他依赖资源之前备份该资源等。 我想将删除 API 扩展到此 (DELETE /resources/{resourceId}?backupBeforeDelete=true...)

上述扩展 API 是否好/推荐?

【问题讨论】:

  • 这应该可以回答您关于 HTTP DELETE 的问题:stackoverflow.com/questions/2539394/… 就是说,您有什么理由不能在同一个端点执行此操作吗?如果您的数据库架构设计正确,您应该能够通过您的{resourceId} 提取相关资源。如果不是这样,考虑修改?

标签: api rest http http-delete


【解决方案1】:

上述扩展 API 是否好/推荐?

可能不会。

HTTP(除其他外)是关于消息语义的协议:关于消息含义的统一协议。

基本目标是,由于每个人都对消息的含义有相同的理解,我们可以使用许多通用组件(浏览器、反向代理等)。

当我们开始尝试以非标准方式处理消息时,我们就失去了通用接口的好处。

就 DELETE 而言,您的用例遇到了一个问题,即 HTTP 没有定义 参数化 DELETE。

在 HTTP 消息中放置参数的通常位置是在消息正文中。可惜……

DELETE 请求消息中的有效负载没有定义的语义;在 DELETE 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求

换句话说,您不能指望通用组件在这里做正确的事情,因为请求正文超出了范围。

另一方面

DELETE /resources/{resourceId}?backupBeforeDelete=true

这存在通用组件无法识别/resources/{resourceId}?backupBeforeDelete=true/resources/{resourceId}相同 资源的问题。两者的标识符不同,发送给一个的消息不会影响另一个。

对于您的用例,正确的答案是更改您的方法令牌;您在这里尝试执行的正确标准方法是 POST

POST 在 HTTP 中有许多有用的用途,包括“此操作不值得标准化”的一般用途。 -- Fielding, 2009

您应该使用资源的“真实”URI(与 GET 请求中使用的相同),并将您需要的任何参数粘贴到有效负载中。

POST /resources/{resourceId}

backupBeforeDelete=true

假设您将 POST 用于其他“不值得标准化”的操作,则请求中需要有足够的上下文,以便服务器可以区分不同的用例。在网络上,我们通常会通过 HTML 表单收集参数,通常的答案是在正文中包含请求令牌

POST /resources/{resourceId}

action=delete&backupBeforeDelete=true

另一方面,如果你认为你正在处理一个值得标准化的动作,那么正确的做法是定义一个具有你想要的语义的新方法标记,并推动采用

MAGIC_NEW_DELETE /resources/{resourceId}

backupBeforeDelete=true

这毕竟是PATCH 的来源; Dusseault 等人认识到补丁语义可能对所有资源都有用,因此创建了一个描述他们想要的语义的文档,并通过标准化过程引导该文档。

【讨论】:

    【解决方案2】:

    根据HTTP Specification,任何 HTTP 消息都可以带有可选的正文和/或标头部分,这意味着您可以在后端控制 - 做什么(例如查看您的服务器接收到的内容并按照惯例执行您的操作),在任何 HTTP 方法的情况下;但是,如果您在谈论RESTful API 设计,DELETE 或任何其他操作应参考 REST API 端点资源,该资源映射到控制器的 DELETE 方法,然后服务器应根据您方法中的逻辑执行操作.

    DELETE /resources/{resourceId} HTTP/1.1
    

    应该没问题。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2015-09-23
      • 1970-01-01
      • 2013-06-11
      • 2010-12-13
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多