rest - REST API - 创建资源和嵌套资源最佳实践
问题描述
我有一个关于 REST API 的问题,尤其是关于资源创建(和嵌套资源)的问题。
假设我们有以下“GET”路由:
GET /recipes/1
{
"id": 1,
"name": "Crepes",
"ingredients": [
{"id": 1, "name": "Flour", "quantity": 100},
{"id": 2, "name": "Milk", "quantity": 15},
...
]
}
GET /recipes/1/ingredients/1
{
"name": "Flour",
"quantity": 100,
"details": "...",
...
}
我的问题是:最佳实践/设计是POST /recipes
什么?(假设我们要创建之前的配方)
- 我们只打了 1 个电话:
POST /recipes
body = {
"name": "Crepes",
"ingredients": [
{"name": "Flour", "quantity": 100, ...},
{"name": "Milk", "quantity": 15, ...}
...
]
}
==> 配方和配料同时创建
- 我们调用 1 次来获取食谱,并调用 X 来获取成分:
POST /recipes
body = {
"name": "Crepes"
}
POST /recipes/1/ingredients
body = {
"name": "Flour",
"quantity": 100,
...
}
...
==> 配方和成分是一个接一个地创建的
那么,资源和嵌套资源的最佳实践/设计是什么?
谢谢 !
解决方案
TL; DR——是的,你想向服务器发送一个请求,并允许服务器“创建”尽可能多的资源来支持未来的工作。
HTTP 中潜在的复杂问题是缓存。REST中的一个重要思想是它“允许在对该概念的任何实现存在之前对该概念进行引用”。
在 web 的上下文中,这意味着客户端可以GET /recipes/1/ingredients/1
在该资源具有表示之前潜在地。当服务器以404 Not Found响应时,该响应是可缓存的。
这里有一个重要的想法:缓存失效具有非常精确的语义;成功的POST /recipes
请求将使/recipes
资源的任何本地缓存副本无效,但不会影响/recipes/1
or的缓存副本/recipes/1/ingredients/1
。
这意味着如果您在 API 前面放置一个通用反向代理,则代理上不同资源的副本不会一起更新。因为不同的资源不会失效,所以在多种情况下,多个资源的消费者会看到不一致的信息。
好消息是,作为原始服务器,您不仅可以控制资源的表示,还可以控制缓存元数据。因此,您可以将缓存策略调整为在相互冲突的设计压力之间取得最佳折衷。
在实践中,您可能会发现批量创建资源不是问题,因为客户端几乎没有理由在资源创建之前获取它。批量更新问题更大。
推荐阅读
- angular-material - Angular Material - 具有多种排序的数据表
- python - 将 zip 文件从发布请求写入文件
- r - 我可以在安装 R 包后删除 LinkingTo 依赖项吗?
- r - For循环计算R中的时间差
- python - 如何在python中子类的__init__之后执行部分“__init__”?
- python - 如何在 Python 中为 k-means 预处理大型 pandas 数据帧
- visual-studio-code - VSCode 客户端-服务器文档同步
- python - 使用 VLC 在单独的函数中播放/暂停音轨
- c++ - 仅在模板中专门构造构造函数,保持最佳性能和整洁的界面
- python - 如何通过 psycopg2 连接提高安全性?