rest - 如何定义我的 REST API?
问题描述
我有 3 个模型:锦标赛、冠军和竞争者:
- 一场比赛有很多冠军;
- 冠军属于锦标赛;_
- 一个冠军有很多竞争对手。
因此,要列出所有锦标赛的所有参赛者,URL 是:
GET https://base.com/tournament/{slug}/competitors
但是要添加一个竞争对手,它与冠军有关,所以:
POST https://base.com/championships/{id}/competitors
对于同一个模型,两个动词(GET 和 POST)有不同的 URI 可以吗?否则,我该怎么办?
我喜欢这样做:
POST https://base.com/tournaments/{slug}/championships/{id}/competitors
没有必要的字段。
解决方案
对于同一个模型,两个动词(
GET
和POST
)有不同的URI可以吗?
这可能会给 API 使用者造成混淆,因此我建议您使用相同的 URI。
请记住,在Roy T. Fielding 的论文第 5 章中描述的 REST 架构风格为构建在此类架构之上的应用程序定义了一组约束。但它没有说明 URI 必须是什么样的。
Martin Fowler 撰写的一篇流行文章中显示的示例解释了 Leonard Richardson 定义的模型,这表明URI 结构看起来友好且易于阅读。虽然它可能是可取的,但它不是REST 应用程序的强制要求。
您可以采用很多有效的方法。如果竞争对手需要锦标赛存在而锦标赛需要锦标赛存在,您可以使用以下方式表达这种层次结构:
/tournaments/{slug}
/tournaments/{slug}/championships/{id}
/tournaments/{slug}/championships/{id}/competitors/{id}
但是最后一个 URI 可能被认为太长并且可能难以记住。所以你可以简单地拆分它,然后你不需要发送很多参数:
/tournaments/{slug}
/championships/{id}
/competitors/{id}
如果您需要执行任何过滤,您可以使用查询参数。例如:
/championships/{id}?tournament={slug}
推荐阅读
- reactjs - 如何使用 Jest 模拟 axios 发布请求?
- c++ - Lambda 表达式(向量之和)
- python - 分别绘制所有 pandas 数据框列
- python - 快速加载错误:FDL4822 DEFINE 语句被拒绝
- java - Java 是否有模棱两可的语法,需要有关标识符的更多信息?
- html-table - 如何在Angular 6的动态材料表中隐藏一列?
- angular - 在 Angular 中关闭全屏时不会调用转义函数
- sql - 如何在 DB2 中永久按列名对表进行排序
- azure-service-fabric - 将动态生成的端口从一个服务传递到同一应用程序中的另一个服务
- python - 我们如何自动知道开源软件是否存在任何新漏洞?