我正在为我的应用程序创建一个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规范一样,我应该为每个实体创建一个端点,
这就是你脱轨的地方(不是你的错,文献很糟糕(
- REST没有端点,它有资源
- HTTP请求目标资源,而不是实体
- "不同的实体因此不同的资源";不是来自REST的约束
细粒度资源在某些情况下运行良好(特别是它们非常适合将信息复制到贫血的数据模型中(,但它们并不通用。在细粒度资源工作不好的情况下。。。以不同的方式设计资源模型。