如何在 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,
这就是你出轨的地方(不是你的错,文献很烂)
- REST 没有端点,它有资源
- HTTP 请求的目标是资源,而不是实体
- “不同的实体因此不同的资源”不是来自 REST 的约束。
细粒度资源在某些情况下效果很好(特别是它们非常适合将信息复制到贫血数据模型中),但它们并不通用。在细粒度资源无法正常工作的情况下...以不同方式设计您的资源模型。
我正在为我的应用程序创建一个 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,
这就是你出轨的地方(不是你的错,文献很烂)
- REST 没有端点,它有资源
- HTTP 请求的目标是资源,而不是实体
- “不同的实体因此不同的资源”不是来自 REST 的约束。
细粒度资源在某些情况下效果很好(特别是它们非常适合将信息复制到贫血数据模型中),但它们并不通用。在细粒度资源无法正常工作的情况下...以不同方式设计您的资源模型。