这个问题与语言无关。让我们不要担心框架或实现,我们只是说一切都可以实现,让我们以抽象的方式看待 REST API。换句话说:我现在正在构建一个框架,但我在任何地方都没有看到任何解决这个问题的方法。
问题
如何为返回集合的两个独立 REST 路径的交集构造 REST URL 端点?简短的例子:如何相交/users/1/comments
和/companies/6/comments
?
约束
所有端点都应返回单个数据模型实体或实体集合。
恕我直言,这是一个非常合理的约束,所有超媒体 API 示例看起来都是这样的,即使在draft-kelly-json-hal-07中也是如此。
如果您认为这是一个无效的约束,或者您知道更好的方法,请告诉我。
例子
因此,假设我们有一个具有三种数据类型的应用程序products
:categories
和companies
。每个公司都可以将一些产品添加到他们的个人资料页面。在添加产品时,他们必须为产品附加一个类别。例如,我们可以像这样访问这种数据:
GET /categories
将返回所有类别的集合GET /categories/9
将返回 id 9 的类别GET /categories/9/products
将返回 id 9 类别内的所有产品GET /companies/7/products
将返回所有添加到 id 7 公司简介页面的产品
我_links
故意省略了超媒体部分,因为它很简单,例如/
给等。我们只_links
需要记住,通过使用超媒体,我们正在遍历关系图。/categories
/companies
如何编写将返回的 URL:来自公司(7)且属于类别(9)的所有产品?换句话说,如何相交/categories/9/products
和/companies/7/products
?
假设所有端点都应该代表数据模型资源或它们的集合,我相信这是 REST 超媒体 API 的一个基本问题,因为在遍历超媒体 api 时,我们正在沿着一条路径遍历关系图,因此不可能描述这种交集,因为它是两个独立图路径的横截面。
换句话说,我认为我们不能只用一条路径来表示两条独立的路径。通常我们会像 一样遍历一条路径A->B->C
,但是如果我们有X->Y
并且Z->Y
我们想要所有Y
来自的 s,X
那么Z
我们就会遇到问题。
到目前为止,我的建议是使用查询字符串:/categories/9/products?intersect=/companies/9
但我们能做得更好吗?
我为什么要这个?
因为我正在构建一个框架,它将基于 SQL 数据库关系自动生成 REST 超媒体 API。您可以将其视为SELECT ... JOIN ... WHERE
查询 URL 的反编译器,但 API 的客户端只看到超媒体,并且客户端希望有一种很好的方式来进行交叉,就像在示例中一样。