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

你们还有其他选择吗?

我会把东西分成不同的资源:

  • CCD_ 6和CCD_。他们提供书籍的详细信息,并允许对其进行管理
  • CCD_ 8和CCD_。他们提供了学校的详细信息,并允许管理这些信息
  • /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从学校中删除特定链接。查询参数可用于指定要删除的链接。

  • CCD_ 16允许在一个调用中执行多个操作,并实际提供一些批处理。您可以在这个级别上利用JSON-PATCH来处理请求。在回应中,你可以描述发生了什么。这个级别没有规范,所以你可以自由使用你想要的。。。以下是请求有效载荷的示例:

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

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

  • 在RESTful服务中实现批量更新:http://restlet.com/blog/2015/05/18/implementing-bulk-updates-within-restful-services/
  • 在选择超媒体类型时:http://sookocheff.com/post/api/on-choosing-a-hypermedia-format/
  • 在API中创建客户端优化的资源表示:http://www.freshblurbs.com/blog/2015/06/25/api-representations-prefer.html

希望它能帮助你,Thierry

最新更新