【问题标题】:REST pattern create, update and delete same endpointREST 模式创建、更新和删除相同的端点
【发布时间】:2015-11-02 18:25:25
【问题描述】:

我有一个页面,其中列出了学校的书籍。用户可以更新书籍、添加新书籍或删除现有书籍。提交表单时必须保存所有操作。

我怎样才能为此映射一个rest API?我可以利用我已经拥有的端点。

更新

PUT /schools/1/books
{
  "books": [
    {
      "id": "1",
      "name": "Book 1"
    }
  ]
}

创建

POST /schools/1/books
{
  "books": [
    {
      "name": "Book 2"
    },
    {
      "name": "Book 3"
    }
  ]
}

删除

DELETE /schools/1/books
{
  "books": [
    {
      "id": 2
    }
  ]
}

但是我需要所有东西都在同一个事务上运行,并且提交 3 个请求是没有意义的。

我还考虑创建一个新端点,在此我将创建不存在的书籍、更新存在的书籍并删除请求中不存在的书籍。

所以如果这所学校有Book 1Book 2,我可以更新Book 1,创建New Book 并删除Book 2

PUT /schools/1/batch-books
{
  "books": [
    {
      "id": "1",
      "name": "Updated Book 1"
    },
    {
      "name": "New Book"
    }
  ]
}

你们还有其他选择吗?

【问题讨论】:

    标签: api rest


    【解决方案1】:

    我会将事物分成不同的资源:

    • /books/books/{id} 用于书籍。他们提供图书详细信息并允许对其进行管理。
    • /schools/schools/{id} 用于学校。他们提供学校详细信息并允许对其进行管理。
    • /schools/{id}/books 关联学校的书籍。我的意思是学校里可以买到的书。该资源提供了管理书籍链接列表的方法。

    让我详细说明最后一个资源。事实上,这与超媒体有关。在下文中,我将使用 JSON-LD,但您可以随意使用其他超媒体工具。

    GET 方法将返回相关书籍的列表:

    GET /schools/1/books
    [
      {
        "@id": "http://api.example.com/books/1895638109"
      },
      {
        "@id": "http://api.example.com/books/8371023509"
      }
    ]
    

    您会注意到,如果需要,您可以实施机制以获取更多详细信息。利用 Prefer 标头似乎是一种很好的方法(有关详细信息,请参阅下面的链接)。

    此外,您还可以提供以下方法:

    • POST 添加学校链接。请求有效负载为:{"@id": "http://api.example.com/books/1895638109"}。响应应该是 201 状态码。

    • DELETE 删除学校的特定链接。查询参数可用于指定要删除的链接。

    • PATCH 允许在一次调用中执行多项操作并实际提供一些批处理。您可以在此级别利用 JSON-PATCH 进行请求处理。在响应中,您可以描述发生了什么。此级别没有规范,因此您可以随意使用您想要的内容......这是请求有效负载的示例:

        PATCH /schools/1/books/
        [
          {
            "op": "add", "value": "http://api.example.com/books/1895638109"
          },
          {
            "op": "remove", "path": "http://api.example.com/books/8371023509"
          }
        ]
      

    阅读以下链接可以为您提供有关设计此类用例的一些提示:

    希望对你有帮助 蒂埃里

    【讨论】:

    • 太棒了,从来没有理解 PATCH 方法的用例,现在一切都清楚了。我去看看你发的资源!非常感谢
    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 2010-11-18
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多