我看了this question,试图解决REST媒体类型爆炸的问题。其中一个建议是使用描述任何集合的媒体类型。例如,我们可以有一个application/vnd.collection+json
,它是一个具有明确定义的语义的集合,可以包含对其他资源的引用列表:
{
"size": "3"
"elements": [
{ "href" : "http://my.api.com/resource/1" },
{ "href" : "http://my.api.com/resource/2" },
{ "href" : "http://my.api.com/resource/3" }
]
}
我知道减轻烦恼的一个选择是包括资源的嵌入表示。一个"泛型"列表的媒体类型实现了吗?根据嵌入式资源在其中的内容,不要更改列表的语义吗?如果嵌入资源具有不同的处理规则(理想情况下由媒体类型传达),则这尤其相关。在这种情况下,允许描述嵌入式资源的媒体类型的带内信息会好吗?例如,对于链接和嵌入式资源,我们可以application/vnd.collection+json
执行以下操作:
{
"size": "3"
"element-content-type": "application/vnd.link+json"
"elements": [
{ "href" : "http://my.api.com/resource/1" },
{ "href" : "http://my.api.com/resource/2" },
{ "href" : "http://my.api.com/resource/3" }
]
}
如果它包含嵌入资源:
{
"size": "3"
"element-content-type": "application/vnd.resource+json"
"elements": [
{
"id": "1"
"name": "Cool Resource"
},
{
"id": "2"
"name": "Awesome Resource"
},
{
"id": "3"
"name": "Super Awesome Resource"
}
]
}
假设application/vnd.link+json
和application/vnd.resource+json
也已记录在案。
答案 0 :(得分:1)
我想到了这一点,我觉得包含像这样的内容类型实际上是可以的。原因是,我们已经这样做了。在HTML中,script
标记的type
属性可以是application/javascript
或application/vbscript
(例如)。为浏览器提供有关如何处理该标记内容的提示。同样,我认为上面示例中的content-type实现了相同的目的:它告诉客户端如何处理集合中的元素。
我想更新这个答案。似乎另一种方法是使用rel。至少,这就是HAL的做法。您可以使用居里创建一个名称空间的rel,以便最终将rel解析为指向该资源文档的URL。通过这种方式,您可以访问文档,并告诉您有关资源的所有信息。