REST风格的Web服务:试图通过自定义XML实现HATEOAS

问题描述:

我正在研究一个企业系统,该系统将在移动客户端和中央服务器之间使用REST风格的Web服务。尽可能RESTful,让我们说。REST风格的Web服务:试图通过自定义XML实现HATEOAS

我的问题涉及HATEOAS(超媒体作为应用程序状态的引擎)以及在HTTP响应主体中使用自定义xml。

该系统将永远永远公共客户端使用,但我喜欢的是能够修改服务器端的资源分配格局的思路HATEOAS后无需重新配置独立每个客户端。如果我们决定由于扩展问题,我们需要将服务器功能分散到多个物理盒子中,没有问题,这将反映在客户端(或客户端指令下的服务器)创建新资源时生成的URI中。

我们的业务领域是非常具体和不寻常的。因此,我希望在整个Web服务中为HTTP响应实体主体使用自定义XML,并且客户端将从XML中解析资源URI,以便随时了解修改其自身应用程序状态时可以使用的资源位置。我知道这'打破'了HATEAOS的H部分。

例如当客户端将事务POST到服务器进行处理时,服务器可能会在201 HTTP响应正文(作为更大的xml文档的一部分)中包含以下xml片段。服务器也会通知客户端URI为新创建的事务资源本身,但这可能只包含在Location HTTP头中。

<resulturi>http://resultserver/results/1234.xml</resulturi> 

这是所以坏?使用这项服务的客户几乎不可能基于浏览器。超媒体在xml中以纯文本的形式提供uris的其他优点是什么?

我想我可以去XHTML,但是我们的移动平台上的解析器对于POX来说效率更高。

+1

>我知道这'打破'了HATEAOS的H部分。 是吗?我不知道HATEOAS会对您可以使用的内容类型加以限制。 – trendels 2009-09-09 12:09:05

你在resulturi中返回一个url所做的事情已经是超媒体了。唯一的问题是,你需要一个媒体类型,告诉客户端如何格式化响应,以便它可以以可预测和记录的方式解析url。

选项1: 创建您自己的媒体类型,如vnd.yourcompany.Resource + xml。通过这样做,您可以指出媒体类型可以被xml解析器解析,但它遵循由贵公司定义的一些特殊规则。此时,您可以使用任何标准来定义超媒体链接(请参阅this问题)。这样做的一个好处是,如果在6个月内您决定需要对XML格式进行重大更改,则可以创建vnd.yourcompany.ResourceV2 + xml,只要您足够聪明就可以使用accept-通过让新客户端应用程序接受新格式,您可以顺畅地将新格式与旧格式并排引入。

选项2: 我对这个选项只有一半认真的看法,但我曾考虑过推出一种名为application/hyperxml + xml的新媒体类型。该文档将遵循与application/xml相同的规则,但也会将XLink用于超媒体。这将允许使用javascript的人解析XML文档,以便以标准方式利用超媒体。

选项3: 使用XHtml。我不明白为什么你的解析器遇到了XHTML的问题,但我会尽力说服你的。

无论底层标记语言如何,RESTful服务器需要处理请求都需要两条重要信息:媒体类型和URI。假设给定URI的媒体类型会引入客户端 - 服务器耦合。例如,它会阻止相同的URI服务于两种不同类型的媒体。

在设计超媒体格式时,XML不是唯一的选择。检查出Sun Cloud API,它定义了一个基于JSON的REST API(虽然它的超链接似乎不使用媒体类型)。从这种方法到结合媒体类型与超链接的方法并不困难。

例如,您可以定义一个名为Link的JSON数据结构,如下所示;

{ 
    "name":"human-readable label for link", 
    "uri":"http://example.com/resources/123", 
    "media_type":"application/vnd.com.example.Resource+json" 
} 

超媒体不需要HTML甚至完全限定的URI。如果您的媒体类型定义了将响应的某些元素转换为不可引用资源的规则,则您使用超媒体。

<result>1234</result> 

上面的例子,并就如何取消引用结果元素的内容是相同的方式超媒体,一个媒体类型的规则相结合:

<result>/foo/1234</result> 

是具有规则预先设置基http URI。所以下面的例子中,http字符串可以忽略的事实可能是隐含的。

<result>http://myserver.com/foo/1234</result> 

然而,虽然他们都是超媒体,并满足约束条件,我会反对,如果在所有可能的,只是重新使用现有的创建您自己的新超媒体的生产规则和代码。第一个例子使用户不那么明显,该元素表示超链接的资源而不是最后一个例子。

+0

前两个示例需要客户端的带外信息...因此它们不是RESTful。 – HDave 2012-01-09 19:28:41

+0

这就是锚标签如何在HTML-HREF中工作。媒体特定处理规则允许相关URL。 – 2012-01-21 00:22:55

我会建议,而不是手动代码这些超链接,使用工具,为您创建这些超链接。 面向交互的编程是创建这些交互(超链接)的好方法。请点击此链接这项技术为我们工作http://www.masterkube.com/hateoas_technology.html

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – PKirby 2015-07-27 07:39:15

在一个非常最低(即使你什么也不做),你应该把你的网址在XLink属性,而不是元素含量:

<resulturi xlink:href="http://resultserver/results/1234.xml"/> 

XML处理器能够解析并按照URI原生地进行处理。作为一般规则,不可翻译或不可能具有子元素的文本应该属于强制执行此类限制的属性。

但除此之外,请做别人的建议并定义您的媒体类型,以便客户能够理解其意义。