【问题标题】:Should REST based modules/controllers be split by resource or action/functionality基于 REST 的模块/控制器是否应该按资源或操作/功能拆分
【发布时间】:2020-06-19 19:55:20
【问题描述】:
我有一个看起来像这样的用例:
API1:在美国获取属于 John 的所有书籍:GET Request/country/us/person/john/books
API2:获取所有国家/地区属于 john 的所有书籍:GET Request /person/john/books
API3:获取所有国家/地区的所有书籍:GET Request on /country/books
我想使用NestJS(但这与这个问题不太相关)构建一个休息服务器,它使用modules的概念来组织controllers。
在这个例子中我应该有一个:
-
module 调用 books 与 1 controller 处理 3 条路线。或者,
- 2
modules、booksByCountry 和 booksByPerson
有没有推荐的方法来考虑这个问题?
【问题讨论】:
标签:
javascript
rest
model-view-controller
nestjs
web-development-server
【解决方案1】:
这取决于您希望如何在语义上设置 API。
对我来说,根据您的用例和资源访问,由于您想按人和/或按国家/地区检索图书资源,我会选择这样的:
第一种思路:
API1:获取在美国属于 John 的所有书籍:
在/books/person/{personName}/country/{countryName}上获取请求
API2:获取所有国家/地区属于 john 的所有书籍:
在/books/person/{personName}上获取请求
API3:获取所有国家/地区的所有书籍:
在/books 上获取请求
另一种思考方式:
API1:获取在美国属于 John 的所有书籍:
在/persons/{personName}/books?country={countryName}上获取请求
API2:获取所有国家/地区属于 john 的所有书籍:
在/persons/{personName}/books?country=all 上获取请求(或/persons/{personName}/books,如果您不想处理all 查询参数值)
API3:获取所有国家/地区的所有书籍:
在/books上获取请求
结论:
这完全取决于 URI 的语义一致性以及您希望处理路径和查询参数的方式。
无论您是想公开您的 API 还是仅供内部使用,请让您公开资源的方式变得简单且连贯,这样您的消费者在阅读文档和使用您的 API 时就不会迷路。
如果有帮助,请告诉我,欢迎 cmets 和其他 POV 讨论此主题!