如何在 REST 中创建复合对象 API

How to create a compound object in a REST API

我正在为我的应用程序创建一个 REST API,我对如何按照 REST 原则设计我的 API 有疑问。我正在使用 PHP 和 Lumen,但我想这更多是设计问题而不是技术问题。

假设我有两个实体:

Company:
    - id
    - name

User:
    - id
    - name
    - email
    - company_id

每个 Company 必须有一个或多个 User,我想在我的 API 中声明该规则。据我了解 REST 规范,我应该为每个实体创建一个端点,因此 API 客户端应该制作一个 POST 到 http:\myserver\api\company 以包含一家公司,然后制作另一个 POST 到 http:\myserver\api\company\{id}\users 以在新的 Company 中包含一个 User。这种方法的问题是客户端只能创建一个 Company 并在没有 User 的情况下保留它。

在非休息 API 中,我可以创建一个名为 createNewUser 的方法,它将接收用户数据和 Company 数据,并且此方法将确保两者实体已创建。

我怎样才能在 REST API 中实现它?

I have a doubt about how to design my API, following REST principles.

这里的部分问题可能是您收到的关于“REST 原则”的令人困惑的消息。

考虑如何在网络上执行此操作。您希望有人向您提供用户数据和公司数据。因此,您将创建一个带有表单的网页;一些表单控件将设计用于收集用户数据,一些将设计用于收集公司数据。提交表单时,浏览器会将表单输入控件中的信息复制到 application/x-www-form-urlencoded 请求主体中,然后 POST 将其复制到表单元数据中指定的目标 URI。 Ta-da.

这就是 REST。

REST 是唯一的答案吗?不。同样 RESTful 是让客户将用户和公司数据写入本地文档,然后将该文档的副本保存在 Web 服务器上。或者从网络服务器下载文档,将用户和公司数据编辑到本地副本,然后将修改后的文档保存在服务器上。或者将描述编辑的补丁文档发送到 Web 服务器,并允许服务器计算对其自己的文档副本所做的更改。

所有这些都很好

as I've understood REST specifications, I should create one endpoint for each entity,

这就是你出轨的地方(不是你的错,文献很烂)

  1. REST 没有端点,它有资源
  2. HTTP 请求的目标是资源,而不是实体
  3. “不同的实体因此不同的资源”不是来自 REST 的约束。

细粒度资源在某些情况下效果很好(特别是它们非常适合将信息复制到贫血数据模型中),但它们并不通用。在细粒度资源无法正常工作的情况下...以不同方式设计您的资源模型。