【发布时间】:2015-12-31 05:35:59
【问题描述】:
这个问题与语言无关。让我们不要担心框架或实现,我们只是说一切都可以实现,让我们以抽象的方式看待 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 并且我们想要来自X 和Z 的所有Ys,那么我们就有问题了。
到目前为止,我的建议是使用查询字符串:/categories/9/products?intersect=/companies/9,但我们能做得更好吗?
我为什么要这个?
因为我正在构建一个框架,它将基于 SQL 数据库关系自动生成 REST 超媒体 API。您可以将其视为对SELECT ... JOIN ... WHERE 查询的 URL 的反编译器,但 API 的客户端只能看到超媒体,并且客户端希望有一种很好的方式来进行交叉,就像在示例中一样。
【问题讨论】:
标签: api rest hateoas hypermedia