繁体   English   中英

我们可以将参数传递给 HTTP DELETE api

[英]Can we pass parameters to HTTP DELETE api

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

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

上述扩展 API 好/推荐吗?

根据HTTP 规范,任何 HTTP 消息都可以带有可选的正文和/或 header 部分,这意味着执行您的操作(例如,您可以在后端控制和常规接收什么)在任何 HTTP 方法的情况下; 但是,如果您在谈论RESTful API设计、DELETE 或任何其他操作,则应参考 REST API 基于端点资源的方法逻辑,然后在您的方法中执行操作,然后在您的方法中执行操作。

DELETE /resources/{resourceId} HTTP/1.1

应该可以。

上述扩展 API 好/推荐吗?

可能不是。

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

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

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

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

在 HTTP 消息中放置参数的通常位置是在消息正文中。 很遗憾...

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

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

另一方面

DELETE /resources/{resourceId}?backupBeforeDelete=true

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

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

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

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

POST /resources/{resourceId}

backupBeforeDelete=true

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

POST /resources/{resourceId}

action=delete&backupBeforeDelete=true

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

MAGIC_NEW_DELETE /resources/{resourceId}

backupBeforeDelete=true

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM