2016-01-21 72 views
1

我一直在试图实现一个RESTFul体系结构,但我对自定义媒体类型的好坏感到十分困惑。HATEOAS内容类型:自定义MIME类型

目前我的应用程序使用Http Link:header来传达“链接”。这非常棒,我使用它的title属性,允许服务器描述这个'行动'实际上是什么,尤其是当提交给用户时。

我很困惑的地方是我是否应该指定一个自定义的mime类型。例如我有一个用户的概念。它可能与当前资源相关联。我要举一个例子,说我有一个拍卖品。我们可能让用户“看”它。因此,我将包括链接

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET"

在标题中。如果您有能力将该用户从观看中移除。

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET,DELETE"

我与此很高兴,如果客户有正确的角色,他可以删除的关系。所以我正在定义如何处理关系。整洁的事情是,我们称之为“关系”资源的GET,我将客户端重定向到用户资源。

什么让我感到困惑的是是否使用自定义MIME类型。在互联网上有两种说法,在我看来这是一种说法。

我已经完成了一个示例,我在其中称为HEAD的未知网址,服务器返回Content-Type: application/vnd.myapp.user。然后,我的客户决定它是否可以理解这种mime类型(它维护它理解的视图资源的映射),并且会遵循它,或者说明它无法弄清楚这个链接结尾处的内容。

这是不好的?我必须保持特殊的MIME类型。特别奇怪的是,我非常乐意使用标准的application/user格式,但无法在任何地方找到指定的格式。

我开始认为我应该试图完全猜测在任何HTTP响应中呈现什么,几乎可能是我的RESTFul api应该只是呈现html,而不是试图用json/xml做任何事情。

我试过搜索(甚至Roy Fieldings博客),但找不到任何描述客户端应该如何处理这种情况的东西。

编辑:我与包括自定义类型的论点是,它可能不一定是一个'用户'看项目,它可能是application/vnd.myapp.group。通过获得响应,客户端知道身体有不同的东西,所以更改为显示组的视图。但是这种耦合的mime-type查看不好?

回答

1

我想说,你一定要为所有表示具有特定的媒体类型。如果你可以找到一个标准的(html,jpeg,atom等),但是如果没有,你应该定义一个(或多个)。

原因是:申述应该是自包含。这意味着你的客户从某个地方获得一个链接,它应该知道该如何处理它。如何显示它,如何从那里继续等。例如,浏览器知道如何显示文本/ html。你的客户应该知道如何显示/处理application/vnd.company.user。

此外,我认为你有内容谈判倒退。您不需要调用HEAD来确定服务器支持的表示形式。您可以使用“Accepts”标题告诉服务器您的客户端在GET/POST/etc请求中支持的内容。事实上,这将是标准的做法。然后,服务器以它可以为您接受的MIME类型提供的“最佳”表示做出响应。你不需要更多的往返。

所以,虽然链接你提供可以包含上下文信息,通常在“相对”属性给出的,就像如果该链接指向一个“下一页”,“上一页”,“订阅用户”或'拥有者用户'等,客户不能假设这些链接下的任何表示。它知道它在语义上是一个'用户',所以它可以填充'接受'标题和一个用户的所有受支持的表示(application/vnd.company.user)。如果该表示只表示text/xml,则客户端无法承担可能会收到的任何内容或链接的语义。

在实践中,您当然可以编写任何客户端来假设哪些表示法是在哪些链接/ url下进行的,并且您不必始终符合REST,但您确实可以获得很多好处(如如果你这样做,Roy Fielding的论文)。

另一个小点:链接不需要包含哪些方法可用于给定资源,这就是OPTIONS的用途。诚然,它很少实施。

+0

请参阅对我来说很奇怪的事情是,客户端和可能是MIME类型几乎必须指定所有可能的事情,观看'。我举了一个例子,说明未来可能会改变“观看”背后的资源,例如一群人。你说客户端语义上知道它是一个用户,但是它应该如何?它不应该得到MIME类型的服务器发回并处理它,而不是假设它是一个'application/vnd.app.user',如果它是一个不同的资源,也有这种关系? –

+0

如果您不想要,您不必指定链接指向用户。但是,你怎么知道首先有一个链接?或者它的“关系”属性意味着什么?重点是,你想分配返回的表示的任何语义必须通过一个MIME类型。所以你至少必须定义,有潜在的用户链接,这只能通过MIME类型来完成。否则,该消息不是独立的。 –

0

您不必发送HTML来提供超媒体服务。有许多不同的超媒体格式比HTML更容易解析。 https://sookocheff.com/post/api/on-choosing-a-hypermedia-format/https://stackoverflow.com/a/13063069/607033

您不必使用特定于领域的MIME类型,在我看来,最好使用特定于领域的词汇表与常规超媒体类型使用JSON-LD + Hydra或ATOM/XML +微数据/ RDFa等格式的微格式或schema.org ...根据您的喜好有很多替代方案。 https://en.wikipedia.org/wiki/Microdata_(HTML)http://microformats.org/http://schema.org/http://www.hydra-cg.com/

我不知道是否添加相同的关系,以多种方法是不错的选择。如果你愿意的话,用链接标题中的不同链接标题发送多个链接:https://stackoverflow.com/a/25416118/607033