我正在开发REST API,我对资源表示有疑问。
假设我在/ app / person / {id} URI下获得了“person”资源。我需要一个XML表示,基本上所有的对象字段都是根目录下的XML节点。现在需求表明我们还必须支持由专有模式强制执行的另一种XML表示。
问题是:是否在REST最佳实践下支持同一资源的“text / my-type”等专有内容类型?请注意,两者都是XML,但格式不同,最重要的是它们不携带相同的信息(例如,一个表示可能包括其他字段,如“modified-since”)
重要!:我知道务实并且保持简单,这比指南和“最佳实践”更重要,但我只是想知道这是否是在RESTful架构下的方式。
答案 0 :(得分:5)
如果第二种格式只是一种不同的语法(或者可以合理地被视为这种格式),那么将它作为第二种表示形式添加到另一种媒体类型中是非常好的(并且RESTful并且符合REST最佳实践)。如果您认为差异不仅仅是语法上的,那么您应该创建一个不同的资源。如果您希望能够链接到特定表示,则情况也是如此(因为如果您想这样做,它需要不同的URI)。在后一种情况下,您可能还需要考虑一个规范的,与格式无关的资源,该资源可以返回303 See Other以及指向特定资源的链接。
答案 1 :(得分:4)
是和否。没有REST约束阻止您从同一URL返回资源的两个不同表示。即使是一种媒体类型是专有格式。小心允许内容变化太大,我听说有些人对此感到非常沮丧。 此外,对于自定义格式,您应使用供应商子树下的媒体类型
e.g。应用/ vnd.companyname.format + xml的
但是,返回专有格式并不是真正的REST精神。话虽这么说,除了限制偶然重复使用之外,你可以毫无问题地做到这一点。
答案 2 :(得分:1)
如果这些只是Person资源的两种不同表示,那么你应该有两种媒体类型。如果可能的话,尝试查找并重用标准表示及其媒体类型(请参阅http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)。两种媒体类型都应采用application/
类型 +xml
的形式(并参阅Darrel的评论)。
答案 3 :(得分:1)
内容协商使用Accept和Accept-Encoding标头构建到HTTP中。客户端应用程序应通过设置这些标头来指定他们想要返回的类型。