端点的RESTful设计,用于过滤和返回最新创建的资源

问题描述 投票:0回答:1

我有一个应用程序,用户可以为给定的一个创建许多子资源。让我们说端点看起来像这样:

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作为路径变量,它将返回单个元素,或者将其用作通常必须返回元素列表的参数,即使此过滤器指定用户只需要一,让客户端更烦人一点。

还有其他选择吗?

rest restful-url
1个回答
1
投票

我的问题是latest对我来说似乎是一个过滤器。 latest每次调用时都可以返回不同的值,具体取决于用户是否创建了新的子资源,根据我的理解,它不是RESTful。

latest标识符似乎很好。请参阅Fielding论文的chapter 5中的以下引用,其中定义了REST架构风格:

某些资源在某种意义上是静态的,当它们在创建后的任何时间进行检查时,它们总是对应于相同的值集。其他人的价值随时间变化很大。对于资源而言,唯一需要静态的是映射的语义,因为语义是区分一个资源与另一个资源的区别。

例如,学术论文的“作者'首选版本”是其值随时间变化的映射,而对“在会议X的会议论文中发表的论文”的映射是静态的。这是两个不同的资源,即使它们在某个时间点都映射到相同的值。区分是必要的,以便可以独立地识别和引用这两种资源。软件工程中的一个类似示例是在引用“最新版本”,“版本号1.2.7”或“橙色版本中包含的修订版”时单独标识版本控制的源代码文件。

© www.soinside.com 2019 - 2024. All rights reserved.