HATEOAS内容类型:自定义mime-type

时间:2016-01-21 08:04:35

标签: rest hateoas

我一直在尝试实施RESTFul架构,但我对自定义媒体类型是好还是坏都非常困惑。

目前,我的应用程序使用Http Link:标头传送"链接"。这很棒,我使用title属性,允许服务器描述这个' action'实际上,特别是当呈现给用户时。

我感到困惑的是我是否应该指定自定义的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为关系&#39;资源,我将客户端重定向到用户资源。

令我困惑的是,是否使用自定义mime类型。在互联网上有两种方式的争论,并且在我的脑海中对此有所论述。

我已经完成了一个示例,其中我在一个未知网址上调用HEAD,服务器返回Content-Type: application/vnd.myapp.user。我的客户然后决定它是否能理解这个mime类型(它维护它理解的资源到映射的映射),并且要么遵循它,要么解释它无法弄清楚该链接的末尾是什么

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

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

我试过搜索(甚至是Roy Fieldings博客),但找不到任何描述客户应该如何应对这种情况的内容。

编辑:我所拥有的包含自定义类型的论点是,它可能不一定是&#39;用户&#39;观看该项目时,它可能是application/vnd.myapp.group的内容。通过获取响应,客户端知道正文有不同的内容,因此更改为显示组的视图。但这种mime-type的结合是不是很糟糕?。

2 个答案:

答案 0 :(得分:1)

我说,你肯定想要为所有表现形式提供特定的媒体类型。如果你能找到一个标准的(html,jpeg,atom等)使用它,但如果没有,你应该定义一个(或多个)。

原因是:表示应该自包含。这意味着您的客户从某个地方获取链接,它应该知道如何处理它。如何显示它,如何从那里开始等。例如,浏览器知道如何显示text / html。您的客户端应该知道如何显示/处理application / vnd.company.user。

另外,我认为您已经向后退了内容协商。您不需要调用HEAD来确定服务器支持的表示形式。您可以使用&#34;接受&#34;来告诉服务器您的客户端在GET / POST / etc请求中支持的内容。头。实际上,这将是实现这一目标的标准方法。然后,服务器以“最佳”方式响应。表示它可以为您提供您接受的哑剧类型。你不需要更多的往返旅程。

因此,虽然您提供的链接可以包含上下文信息,但通常在&#39; rel&#39;中提供。属性,就像链接指向“下一页”,“上一页”,“订阅用户”一样。或者&#39;所有者用户&#39;等,客户端不能在这些链接下承担任何表示。它知道它在语义上是一个“用户”,因此它可以填充“接受者”#39;标题包含用户的所有受支持的表示形式(application / vnd.company.user)。如果表示只显示text / xml,则客户端无法假设其可能接收的内容或链接的语义。

在实践中,您当然可以编写任何客户端代码,只是假设哪些表示位于哪些链接/网址下,并且您不必始终遵循REST,但您确实获得了很多好处(描述如果你这样做,请参阅Roy Fielding的论文。

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

答案 1 :(得分:0)

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

您不必使用特定于域的MIME类型,在我看来,最好使用具有一般超媒体类型的域特定词汇表,例如微格式或schema.org与JSON-LD + Hydra或ATOM / XML +微数据/ RDFa等...根据您的口味,有很多选择。 https://en.wikipedia.org/wiki/Microdata_(HTML) http://microformats.org/ http://schema.org/ http://www.hydra-cg.com/

我不确定是否向多个方法添加相同的关系是一个不错的选择。如果需要,可以使用d发送包含不同链接标头的多个链接:https://stackoverflow.com/a/25416118/607033