我有一个应用程序,用户可以为给定的一个创建许多子资源。让我们说端点看起来像这样:
POST /main-resources/{id}/sub-resources
子资源包含一段时间限制日期作为正文的一部分,如:
{
"startDate": "2018-10-10",
"endDate": "2018-12-12"
}
他们也考虑价值对象。在应用程序方面,它们没有id(即使它们是由SQL数据库备份,因此它们有一个),因为在这种情况下搜索子资源而不通过主资源是没有意义的。
现在,我想创建一个端点,允许用户查找给定主资源的子资源,但它必须只返回创建的最新一个,其中一段时间包含给定的日期。类似于以下内容:
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
作为路径变量,它将返回单个元素,或者将其用作通常必须返回元素列表的参数,即使此过滤器指定用户只需要一,让客户端更烦人一点。
还有其他选择吗?
我的问题是
latest
对我来说似乎是一个过滤器。latest
每次调用时都可以返回不同的值,具体取决于用户是否创建了新的子资源,根据我的理解,它不是RESTful。
latest
标识符似乎很好。请参阅Fielding论文的chapter 5中的以下引用,其中定义了REST架构风格:
某些资源在某种意义上是静态的,当它们在创建后的任何时间进行检查时,它们总是对应于相同的值集。其他人的价值随时间变化很大。对于资源而言,唯一需要静态的是映射的语义,因为语义是区分一个资源与另一个资源的区别。
例如,学术论文的“作者'首选版本”是其值随时间变化的映射,而对“在会议X的会议论文中发表的论文”的映射是静态的。这是两个不同的资源,即使它们在某个时间点都映射到相同的值。区分是必要的,以便可以独立地识别和引用这两种资源。软件工程中的一个类似示例是在引用“最新版本”,“版本号1.2.7”或“橙色版本中包含的修订版”时单独标识版本控制的源代码文件。