使用 HTTP PUT 更新嵌套资源的适当方法是什么?

时间:2021-05-21 18:46:35

标签: rest webapi http-put

我和我的同事正在讨论如何正确实现带有嵌套资源的 HTTP PUT 请求。

示例情况:每个用户可以有多个地址,可以更新、删除或添加。我们正在尝试最小化 API 的表面,并在单个事务中执行大部分操作,因此理想情况下,单个 PUT 端点应该处理所有这些操作。

开发人员 1 建议采用这种方法: PUT /users/1

function copy(originalFlavors) {

var originalFlavors = [
        "Banana Nut Fudge",
        "Black Walnut",
        "Burgundy Cherry",
        "Butterscotch Ribbon",
        "Cherry Macaron",
        "Chocolate",
        "Chocolate Almond",
        "Chocolate Chip",
        "Chocolate Fudge",
        "Chocolate Mint",
        "Chocolate Ribbon",
        "Coffee",
        "Coffee Candy",
        "Date Nut",
        "Eggnog",
        "French Vanilla",
        "Green Mint Stick",
        "Lemon Crisp",
        "Lemon Custard",
        "Lemon Sherbet",
        "Maple Nut",
        "Orange Sherbet",
        "Peach",
        "Peppermint Fudge Ribbon",
        "Peppermint Stick",
        "Pineapple Sherbet",
        "Raspberry Sherbet",
        "Rocky Road",
        "Strawberry",
        "Vanilla",
        "Vanilla Burnt Almond"
    ];


    console.log(copy(originalFlavors));
}

在此示例中,当前在 DB 中的所有用户现有地址都将被删除并替换为这两个提供的地址 - “street1”和“street2”。如果为addresses 属性提供的值是一个空数组,例如{ "fullName": "John Doe", "addresses": [ { "street": "street1", "zipCode": "15000" }, { "street": "street2", "zipCode": "15200" } ] } - 将从数据库中删除所有用户的地址。此外,禁止将地址设置为空:"addresses:" : [],只能提供空数组或包含项目的数组。

开发人员 2 建议采用这种方法: PUT /users/1

"addresses":null

注意 - 第一个地址对象中有 { "fullName": "John Doe", "addresses": [ { "id": 5, "street": "street1", "zipCode": "15000" }, { "street": "street2", "zipCode": "15200" } ] } 。在这个例子中,提供了一个 id 为 5 的地址 - 这将导致更新一个具有 Id 5 的现有地址。此外,还有一个没有指定 Id 的地址。这将创建一个新用户的地址(我的意思是数据库中带有新 Id 的新地址记录)。最后,所有当前存在的用户地址(不包括 id=5 的地址)将从数据库中删除。总而言之,这种方法允许前端开发人员指定是否应该更新现有实体,或者是否应该创建具有新 Id 的新地址。

老实说,我不知道客户端应用程序是否应该负责指定是否应该更新或创建地址。第一个示例总是重新创建用户的地址。

如果地址也有上传的文件,则可以(使用示例 2)将该上传的文件保存在数据库中并仅更新 zipCode - 开发人员 1 的示例不允许这样做 - 一个新的地址始终是创建的,因此链接到该地址的任何先前上传的文件也将被“级联”删除。

我们也可以选择使用 HTTP DELETE 或 HTTP PATCH 端点来删除或修改用户的地址,但如前所述,我们试图拥有尽可能少的端点并使用单个事务来执行大部分与数据库相关的事务操作。

我想知道您对嵌套资源是否应使用 ID 标识以及所提供的两种方法是否足够好,或者另一方面存在根本缺陷/违反某些 REST API 标准的看法。

0 个答案:

没有答案
相关问题