我有一个页面,列出了一所学校的书籍。用户可以更新图书、添加新书或删除现有图书。提交表单时必须保存所有操作。
我如何为它映射一个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 1
和Book 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