我有一个页面,列出了学校的书籍。用户可以更新书籍,添加新书或删除现有书籍。提交表单时必须保存所有操作。
我如何映射其余的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 1
和Book 2
,我可以更新Book 1
,创建New Book
并删除Book 2
:
PUT /schools/1/batch-books
{
"books": [
{
"id": "1",
"name": "Updated Book 1"
},
{
"name": "New Book"
}
]
}
你们有其他选择吗?
答案 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"
}
]
阅读以下链接可以为您提供设计此类用例的方法的一些提示:
希望它可以帮到你, 亨利