我正在创建REST API,目前,我遇到以下问题:
Foo
是第一资源。可以通过/foo/
URI 应用CRUD操作。Bar
是第二资源。可以通过/bar/
URI 应用CRUD操作。- 每个
Foo
都与零或一相关联Bar
。之所以不将其Bar
视为的子资源,Foo
是因为Bar
可以在Foo
多个s 之间共享同一实例。因此,我认为最好通过独立的URI而不是通过URI访问它/foo/[id]/bar
。
我的问题是,在很多情况下,请求Foo
实例的客户端也对关联的Bar
实例感兴趣。当前,这意味着他们必须执行两个查询而不是一个。我想介绍一种允许通过单个查询获取两个对象的方法,但是我不知道如何为此建模。到目前为止,我想出了什么:
- 我可以引入类似于以下内容的查询参数:
/foo/[id]?include_bar=true
。这种方法的问题在于,响应的资源表示形式(例如JSON结构)将需要看起来不同(例如,容器{ foo: ..., bar: ... }
而不是仅序列化的容器Foo
),这会使Foo
资源端点“异构”。我不认为这是件好事。查询时/foo
,无论查询参数如何,客户端都应始终获得相同的资源表示形式(结构)。 - 另一个想法是引入一个新的只读端点,例如
/fooandbar/[foo-id]
。在这种情况下,返回像这样的表示形式没有问题{ foo: ..., bar: ... }
,因为那样的话,它只是fooandbar
资源的“正式”表示形式。但是,我不知道这样的辅助端点是否真的是RESTful的(这就是为什么我在问题的标题中写了“ can”的原因。当然,从技术上讲这是可能的,但是我不知道这是一个好主意)。
你怎么看?还有其他可能性吗?
Foo和Bar之间的关系是什么术语?您能说Bar是Foo的父母吗?
—
内森·美林
如果
—
ceran
Bar
不与关联,则不能存在Foo
。但是,正如我上面所写,多个可能Foo
共享相同的Bar
。可以创建一个Foo
没有Bar
关联的,因此我认为Bar
不应将其视为父项。
我认为通过将域模型关系直接转换为URI并将资源等同于域实体,您遇到了一些我遇到的问题。可能有趣的是REST API必须是超文本驱动的。特别注意第4点
—
减毒活疫苗