REST媒体类型扩散

时间:2014-08-21 22:45:45

标签: api rest content-type api-design media-type

我看了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+jsonapplication/vnd.resource+json也已记录在案。

1 个答案:

答案 0 :(得分:1)

我想到了这一点,我觉得包含像这样的内容类型实际上是可以的。原因是,我们已经这样做了。在HTML中,script标记的type属性可以是application/javascriptapplication/vbscript(例如)。为浏览器提供有关如何处理该标记内容的提示。同样,我认为上面示例中的content-type实现了相同的目的:它告诉客户端如何处理集合中的元素。

我想更新这个答案。似乎另一种方法是使用rel。至少,这就是HAL的做法。您可以使用居里创建一个名称空间的rel,以便最终将rel解析为指向该资源文档的URL。通过这种方式,您可以访问文档,并告诉您有关资源的所有信息。