REST API 两个单独的资源来创建一个用户?

REST API Two seperate resources to create a user?

目前正在构建 REST API,其中一项功能是创建用户。我的应用程序将通过两种方式创建用户:

我的设置是 users table、users_metadata table 和 users_permissions table,以及其他几个。电子邮件和密码存储在 users table 中,用户名和出生日期存储在 users_metadata table 中。手动创建用户时,可以更改其他元数据和用户权限,以及其他 table 中的数据。

使用两种不同的资源来处理创建用户会更好吗?

Would it be better to have two different resources to handle creating a user?

我不会创建两个不同的资源来代表 user 并且都模拟其创建过程。既然一个用户就是一个用户,我认为他们应该通过相同的资源创建。

Manual creation, admin adds a user with usual data AND any extra data as required.

When manually creating a user other metadata and the user's permissions, as well as data in the other tables, can be changed.

如果有意义,您可以将此额外数据建模为单独的(子)资源。权限也是如此。这个子资源然后可以有自己的 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 处使用单独的子资源的方法使访问控制和验证更容易一些。另一方面,它给客户带来了更大的负担。也可以把你放到admin创建用户的位置,基本信息都保存了,但是保存权限有错误;根据您的用例,您可能需要也可能不需要以某种方式自动处理它。

子资源嵌套在数据结构中的方法使处理 POST 请求的逻辑有点复杂,但它确实使客户端的事情变得更容易,并为您提供了选择通过将其包装在事务中并在出现任何问题时回滚来使整个操作原子化。

注意:这两种方法并不相互排斥;如果你愿意,你可以两者都做。

这些方法中哪种最好取决于有多少子资源,它们有多复杂以及对子资源的访问控制有多复杂;子资源越多 and/or 访问控制越复杂,我就越有可能为子资源设置不同的 URL。

在这种特定情况下,我将在数据结构中净化子资源,并让客户端一次 POST 所有数据。