REST模式创建,更新和删除相同的端点

时间:2015-11-02 18:25:25

标签: api rest

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

我如何映射其余的API?我可以利用我已有的端点。

更新

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

CREATE

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

DELETE

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

你们有其他选择吗?

1 个答案:

答案 0 :(得分:4)

我会把事情分成不同的资源:

    书籍是
  • /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"
      }
    ]
    

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

希望它可以帮到你, 亨利