api - REST 模式创建、更新和删除相同的端点

标签 api rest

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

我如何为它映射一个 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"
    }
  ]
}

你们还有其他选择吗?

最佳答案

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

  • /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 header 似乎是一个很好的方法(有关更多详细信息,请参见下面的链接)。

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

  • 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"
        }
      ]
    

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

希望对你有帮助, 蒂埃里

关于api - REST 模式创建、更新和删除相同的端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484385/

相关文章:

android - 从 MVC Web 应用程序链接到 Apple Wallet 或 Android Pay

api - 浏览器 API key 不适用于引用程序

java - Face++ 比较 API

Java MVC 和 Rest 服务器以及 JavaScript 重客户端

java - 使用休息服务在浏览器中显示 pdf

rest - 如何为 SOAP Web 服务提供 REST 接口(interface)?

.NET 独立后端和 WebAPI 与否

facebook - 收到 Facebook 错误 11

api - 如何将分页添加到REST API?

angularjs - 使用 Laravel 将部分 html 模板加载到 Angular 应用程序中