这里真正的问题是:您的第二个示例是否满足 URI 标准?URI 标准规定,路径包含分层部分,查询包含非分层部分,但是 afaik。它没有说明如何在您的情况下设计 URI 结构。REST 统一接口约束有一个 HATEOAS 部分,这意味着您应该在您的情况下发回指向上层和下层资源的链接。您应该使用元数据注释这些链接,这些元数据可以由客户端处理,因此它会知道链接是关于什么的。所以在实践中URI结构并不重要......
GET /shows/123
{
"label": "The actual show",
"_embedded": {
"episodes": [
{
"label": "The first episode of the actual show",
"_embedded": {
"associations": [
//...
]
},
"_links": {
"self": {
"label": "Link to the first episode of the actual show",
"href": "/episodes/12345"
},
"first": {
"href": "/episodes/12345"
},
"duplicate": {
"href": "/networks/3/shows/123/episodes/12345"
},
"up": {
"label": "Link to the actual show",
"href": "/shows/123"
},
"next": {
"label": "Link to the next episode of the actual show"
"href": "/episodes/12346"
},
"previous": null,
"last": {
"href": "/episodes/12350"
}
}
}//,
//...
]
},
"_links": {
"self": {
"label": "Link to the actual show",
"href": "/shows/123"
},
"duplicate": {
"href": "/networks/3/shows/123"
},
"up": {
"label": "Link to the actual network",
"href": "/networks/3"
},
"collection": {
"label": "Link to the network tree",
"href": "/networks"
},
"next": {
"label": "Link to the next show in the actual network",
"href": "/shows/124"
},
"previous": {
"label": "Link to the previous show in the actual network",
"href": "/shows/122"
}
}
}
现在这只是 HAL+JSON 中带有 IANA 链接关系的测试版,但您也可以将 JSON-LD 与 RDF 词汇表(例如 schema.org+hydra)一起使用。这个例子只是关于层次结构(上,第一个,下一个,上一个,最后一个,集合,项目等...),但您应该添加更多元数据,例如哪个链接指向网络,哪个链接指向一个节目,以及哪个链接一集,等等......所以您的客户将从元数据中知道内容是关于什么的,例如,他们可以使用链接自动导航。这就是 REST 的工作方式。所以 URI 结构对客户端来说并不重要。(如果你想让你的响应更紧凑,你也可以使用紧凑的 URI 和 URI 模板。)