我有一个应用程序,用户可以在其中为给定资源创建许多子资源。假设端点看起来像这样:
POST /main-resources/{id}/sub-resources
子资源包含一个受日期限制的时间段(作为正文的一部分),例如:
{
"startDate": "2018-10-10",
"endDate": "2018-12-12"
}
它们也是价值对象。在应用程序方面,它们没有ID(即使它们是由SQL数据库备份的,因此它们也有一个ID),因为在这种情况下不经过主对象就搜索子资源是没有意义的
现在,我想创建一个端点,该端点允许用户查找给定主资源的子资源,但是它必须只返回创建的最新资源,该时间段包含给定日期。类似于以下内容:
GET /main-resources/{id}/sub-resources/latest?date=2018-11-11
我的问题是latest
对我来说似乎是一个过滤器。 latest
每次调用时可以返回不同的值,具体取决于用户是否创建了新的子资源,据我所知,该子资源不是RESTful的。我认为它应该比上一个端点更像:
GET /main-resources/{id}/sub-resources?latest=true&date=2018-11-11
或
GET /main-resources/{id}/sub-resources?limit=1&date=2018-11-11&order=desc
提供了更多选项,但在我的用例中实际上并不需要。
通过这种方式,用户通常会期望得到一个结果,但这将为其他类型的过滤(例如仅按日期进行过滤)敞开大门。
因此,基本上,我可以选择创建一个包含latest
作为路径变量的端点,该端点将返回单个元素,或者将其用作通常必须返回元素列表的参数,即使此过滤器指定用户只想要一个,使客户端更加烦恼。
还有其他选择吗?
答案 0 :(得分:1)
我的问题是
latest
对我来说似乎是一个过滤器。latest
每次调用时可以返回不同的值,具体取决于用户是否创建了新的子资源,据我所知它不是RESTful的。
latest
标识符似乎很好。请参见Fielding论文的chapter 5中的以下引用,其中定义了REST体系结构样式:
从某种意义上说,某些资源是静态的,在创建后随时检查它们时,它们始终对应于相同的值集。其他人的价值则随时间变化很大。资源唯一需要静态的是映射的语义,因为语义是将一个资源与另一个资源区分开的地方。
例如,学术论文的“作者偏爱版本”是一个值随时间变化的映射,而到“在X会议录中发表的论文”的映射是静态的。这是两个截然不同的资源,即使它们在某个时间点都映射到相同的值。区分是必要的,以便可以独立识别和引用这两种资源。来自软件工程的一个类似示例是,当引用“最新版本”,“版本号1.2.7”或“ Orange版本附带的版本”时,分别标识了版本控制的源代码文件。