REST API约定以事务方式更新2个不同的资源

标签 rest api-design

我有一个包含多个资源的 REST API。有一种情况需要更新两个不同的资源。这两者具有一对一的关系,必须以事务方式更新。

假设我们有用户房屋资源。您更喜欢哪种选择或认为这是最好的方法?我想知道哪种方式在尊重 REST API 设计约定的同时更不易出错。

选项 1

定义一个端点,它将用户和房屋作为主体并将其更新为事务。

[PUT] BASE/users/houses/update
{
  "user": {...},
  "house": {...}
}

选项 2

定义两个单独的端点,每个端点分别更新自己的资源并处理错误。

[PUT] BASE/users/:id
{
 ...
}

[PUT] BASE/houses/:id
{
 ...
}

解决方案

根据 Evert 的建议,我定义了一个名为 landlords 的虚拟资源,并且更新以事务方式发生。 REST端点如下:

[PUT] BASE/landlords
{
  "user": {...},
  "house": {...}
}

最佳答案

我认为很多人都陷入了 REST 必须是 CRUD 的陷阱,但实际上您并不局限于此。

与其考虑两个需要更新某些属性的实体,不如尝试考虑“意图”。如果有一个明确的“意图”,该意图具有更新多个实体的副作用,并且它们应该一起成功或失败,那么最好将其公开为单个操作。

尽管普遍认为,RPC 又名“提交表单”并不反 RESTful。许多复杂的系统最终需要将突变与读取状态分开。

也就是说,这个模式:

PUT /users/houses/update
{
  "user": {...},
  "house": {...}
}

感觉不对,因为从 HTTP 的角度来看,这建议您“替换“更新”端点”。您应该:

  • 尝试提出一个同时代表用户和房屋的 URI/资源。
  • 在这些情况下采用 POST。

关于REST API约定以事务方式更新2个不同的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76648407/

相关文章:

java - 作为库作者,期​​望用户根据情况将 null 传递给方法参数是不是很糟糕的设计?

c - 为什么 _mm_permute_ps 的最后一个参数是一个 int?

rest - 如果资源正在使用且无法删除,请更正 Delete API 的 HTTP 响应代码

java - 为什么要将 API 定义和实现 JAR 分开

java - MULE ESB 中的 REST 调用

javascript - 过滤分页传递参数到异步 ember 数据关系请求

java - 从 httprequest 创建 JSON,然后解析它

rest - HTTP API : Communicating the need to authenticate to a third party

javascript - Google 的自定义搜索 API 是 SOA 的一个示例,不是 Restful

api - 如何在 Meteor 中创建一个 Rest API