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



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

假设我有两个实体:

Company:
- id
- name
User:
- id
- name
- email
- company_id

每个Company必须有一个或多个User,我想在我的API中断言该规则。根据我对REST规范的理解,我应该为每个实体创建一个端点,因此API客户端应该对http:\myserverapicompany进行POST以包含公司,然后对http:\myserverapicompany{id}users进行另一次POST以在新的Company中包含User。这种方法的问题在于,客户端只能创建一个Company,而不创建User

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

我如何在REST API中实现这一点?

我对如何按照REST原则设计我的API有疑问。

这里的部分问题可能是你收到的关于";REST原则";。

考虑一下如何在网络上做到这一点。您希望有人同时向您提供用户数据和公司数据。所以你可以创建一个带有表单的网页;一些表单控件将用于收集用户数据,一些则用于收集公司数据。提交表单时,浏览器会将表单输入控件中的信息复制到application/x-www-form-urlencoded请求体中,并将其POST到表单元数据中指定的目标URI。

那是REST。

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

所有这些都很好。

正如我理解REST规范一样,我应该为每个实体创建一个端点,

这就是你脱轨的地方(不是你的错,文献很糟糕(

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

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

最新更新