这个问题是语言无关。让我们不用担心框架或实现,让我们说一切都可以实现,让我们以抽象的方式看待REST API。换句话说:我现在正在构建一个框架,并且我没有看到任何地方的任何解决方案。如何构建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的类别9GET /categories/9/products
将返回所有的产品里面的id类的集合9GET /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
,并且我们希望所有来自X
和Z
的Y
都有问题。
到目前为止,我的建议是使用查询字符串:/categories/9/products?intersect=/companies/9
,但我们可以做得更好吗?
为什么我要这个?
因为我构建了一个基于SQL数据库关系自动生成REST Hypermedia API的框架。您可以将其视为一个到SELECT ... JOIN ... WHERE
查询的URL转换编译器,但API的客户端只能看到超媒体,并且客户端想要有一个很好的交点的方式,就像这个例子。
你是否建议客户端没有魔幻ID的9&5?这不是很RESTful –