目前正在构建REST API,其中一个功能是创建用户。我的应用程序有两种创建用户的方式:
我的设置是users
表,users_metadata
表和users_permissions
表,以及其他一些表。电子邮件和密码存储在users
表中,用户名和出生日期在users_metadata
表中。手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据。
有两种不同的资源来处理创建用户会更好吗?
答案 0 :(得分:3)
有两种不同的资源来处理创建用户会更好吗?
我不会创建两个代表user
的不同资源,并且都会为其创建过程建模。由于用户是用户,因此我认为应该通过相同的资源创建用户。
手动创建,管理员会为用户添加常用数据以及所需的任何额外数据。
手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据。
如果有意义,您可以将此额外数据建模为单独的(子)资源。权限也是如此。然后,此子资源可以拥有自己的URL(例如/users/{id}/meta
和/users/{id}/permissions
),客户端向其发出单独的POST
请求,或者它可以嵌套在发送到的数据结构中API,如下:
{
"name": "John",
"email-address": "john@doe.com",
"permissions": {
"read": true,
"write": false
},
"meta-data": {
"date-of-birth": "2000-01-01"
}
}
在自己的URL上使用单独的子资源的方法使访问控制和验证更容易一些。另一方面,它给客户带来了更大的负担。它还可以让您进入管理员创建用户的位置,保存基本信息,但保存权限时出错;根据您的使用情况,您可能需要或可能不需要以某种方式自动处理。
子资源嵌套在数据结构中的方法使得处理POST
请求的逻辑更加复杂,但它确实使客户端更容易,并且让您可以选择整个行动原子通过将其包装在一个事务中并在出现任何问题时回滚。
注意:这两种方法并不相互排斥;如果你愿意,你可以两者兼顾。
这些方法中哪一种最佳将取决于它们有多少子资源,它们有多复杂以及对子资源的访问控制有多复杂;如果子资源越多和/或访问控制越复杂,我就越有可能为子资源设置不同的URL。
在这种特定情况下,我会在数据结构中净化子资源,并让客户端POST
同时拥有所有数据。