Php RESTAPI两个独立的资源来创建一个用户?
目前正在构建一个RESTAPI,其功能之一是创建用户。我的应用程序有两种创建用户的方法:Php RESTAPI两个独立的资源来创建一个用户?,php,rest,api-design,Php,Rest,Api Design,目前正在构建一个RESTAPI,其功能之一是创建用户。我的应用程序有两种创建用户的方法: 注册后,用户添加自己的常用数据:电子邮件、密码、用户名、出生日期 手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据 我的设置是一个users表、users\u metadata表和users\u permissions表以及其他一些表。电子邮件和密码存储在users表中,用户名和出生日期存储在users\u metadata表中。手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数
- 注册后,用户添加自己的常用数据:电子邮件、密码、用户名、出生日期
- 手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据
users
表、users\u metadata
表和users\u permissions
表以及其他一些表。电子邮件和密码存储在users
表中,用户名和出生日期存储在users\u metadata
表中。手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据
有两种不同的资源来处理创建用户是否更好
有两种不同的资源来处理创建用户是否更好
我不会创建两个不同的资源,它们都代表用户
,并且都对其创建过程建模。因为一个用户就是一个用户,我认为他们应该通过相同的资源创建
手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据
手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据
如果有意义,您可以将这些额外的数据建模为一个单独的(子)资源。权限也是如此。然后,该子资源可以有自己的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
在这个特定的例子中,我将在数据结构中对子资源进行净值计算,并让客户机同时发布所有数据
有两种不同的资源来处理创建用户是否更好
我不会创建两个不同的资源,它们都代表用户
,并且都对其创建过程建模。因为一个用户就是一个用户,我认为他们应该通过相同的资源创建
手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据
手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据
如果有意义,您可以将这些额外的数据建模为一个单独的(子)资源。权限也是如此。然后,该子资源可以有自己的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
在这种特定情况下,我将对数据结构中的子资源进行联网,并让客户端同时发布所有数据。这取决于,如果要限制用户,可以有多个端点,一个用于受限制的用户,一个用于管理员,如果你想限制用户,你可以有多个端点——一个用于受限制的用户,一个用于管理员——这是个很好的主意,但是无法创建一个同时具有权限和元数据(事务性)的用户可能会有问题。你是对的,这肯定是不使用“不同URL的子资源”的原因方法我试着解释,在以“它也可以把你放在哪里”开头的句子中;如果那部分不清楚,请告诉我;我会试着想出一个更好的方法来表达我的观点。当然;)不