rest - 使用单个 URI 和单个请求处理多个 HTTP 方法的正确方法是什么
问题描述
我想了解解决以下问题的正确请求/响应结构和 API 设计。我有 2 个实体,比如说 Abc 和 Xyz。Xyz 的外键是 Abc。因此,要为 Xyz 创建记录,必须映射 Abc 记录。
现在从请求结构的角度来看,我需要为 Abc 创建一个 POST 请求,就像
POST /Abc
这非常简单。但问题在于 Xyz。要求是每当用户来创建 Xyz 时,他也可以请求更新附加的 Abc 记录。例如,我为 Abc 创建了一条 id 为 5 的记录。现在,每当我想创建相应的 Xyz 记录时,我都会请求更新 id 为 5 的 Abc 记录,并为此外键创建一条新的 Xyz 记录。所以, PATCH /Abc 和 POST /Xyz 但是客户端只请求一次并在单个 URI 上共享整个数据。
那么,在单个 URI 上处理多个 HTTP 方法的正确方法是什么?我应该创建 POST 请求还是 PATCH?
我无法创建 2 个请求,因为客户希望这个过程是事务性的。
解决方案
首先我想你应该这样想
我无法创建 2 个请求,因为客户希望这个过程是事务性的。
用另一种方式。正如我所看到的,对事务性的要求可能只是意味着——我可能在这方面大错特错,所以找出真相——当Abc
创建新的过程也有更新时,更新Xyz
是事务性的Abc
。因此,Xyz
如果更新Abc
失败(反之亦然)并返回一些错误,则不会创建。
因此,您也许可以创建两个端点:
- 一个只有POST的:创建一个新的
Xyz
- 另一个用于同时创建新的
Xyz
和更新Abc
的事务
因此,您也许可以创建两个端点。这里更有趣的是后者是POST还是PATCH?似乎两者兼而有之,是的。
但是请参阅 - 例如 -这个问题和接受的答案,关于PATCH:
PATCH 方法请求将请求实体中描述的一组更改应用于由 Request-URI 标识的资源
现在,以下问题是Abc
Request-URI 标识的更改?如果不是,那么它就是 - 据我所知 - 一个POST。
这意味着您应该只需要一个POST端点来检查是否有需要以及是否需要事务更新 id。但也许拥有单独的端点会更好。
推荐阅读
- linux - linux如何获取最深的子文件夹?
- sql - 字符串中的 SQL 列值
- html - svg 带内边框的边框角
- asp.net-mvc - 没有 IoC 的参数构造函数
- sql-server - 如何处理 SQL Server 中的记录瓜
- node.js - 谷歌上的操作不起作用,但它们在对话流中起作用
- amazon-web-services - AWS Glue JSON 限制
- performance-testing - 在负载测试进行时,有没有办法以编程方式检查正在运行的 VUser 计数?
- asynchronous - Flutter 无法从剪贴板读取
- java - WebDriverException:无法创建新会话,因为未找到需要 HttpClient、InputStream 和 long 的“createSession”