Json SpringBoot使用PUT映射创建/更新资源

Json SpringBoot使用PUT映射创建/更新资源,json,spring-boot,rest,Json,Spring Boot,Rest,考虑以下Json主体- { "id": 1, "userName": "test-user1@test.com", "emails": [ { "id": 69, "emailAddress": "test-user1-x@test.com" },

考虑以下Json主体-

{
    "id": 1,
    "userName": "test-user1@test.com",    
    "emails": [
        {
            "id": 69,
            "emailAddress": "test-user1-x@test.com"
        },
        {
            "emailAddress": "test-user1-y@test.com"
        }
    ]
}
在此示例中,“用户”实体与“电子邮件”实体具有一对多关系。当我更新用户时,我也想更新和/或创建电子邮件。我知道应该有一个用于创建/更新电子邮件的端点,并且应该有一个用于创建/更新用户的端点

帖子/用户

PUT/users/{id}

POST/users/{id}/email

放置/users/{id}/emails/{emailId}


但我想知道,使用“PUT/users/{id}”端点创建/更新电子邮件是否是一种好的做法?例如:如果emails数组元素具有“id”属性,则更新现有电子邮件。如果电子邮件数组中缺少“id”属性,则创建电子邮件。这是一种好的思考方式。

仅使用POST创建,仅用于更新

POST是一种在服务器上更改状态的方法,意味着每次创建POST时都会创建新记录

PUT是幂等的,这意味着对于相同的请求,对于任意数量的调用,结果应该是相同的

我建议:

创建一个用户

PUT /users/{id}
更新id为{id}的用户。请求正文包含用户信息,id为 作为url中的路径变量从中获取

POST /users/{id}/emails
为用户id{id}创建电子邮件,id取自url,电子邮件 信息在身体里

PUT /users/{id}/emails/{emailId}
更新id为{emailId}的用户{id}电子邮件的电子邮件,电子邮件id为 取自url,来自正文的电子邮件数据

PUT /users/{id}/emails/{emailId}