为什么人们希望将Json和XML作为输出提供给他们的REST接口?

我明白为什么“REST框架”供应商希望提供返回基于Json的表示和基于XML的表示forms的支持, 但为什么人们希望从同一个服务返回

  • 是否因为您将有一个客户端应用程序构build在没有可用的Jsonparsing器的平台上?

  • 是因为你希望更广泛地采用界面,因为你可以吸引更多的人

  • 是否因为你认为所有RESTful接口遵循标准惯例

如果你确实交付两个:

您是否避免使用XML中的名称空间,以便与Json格式兼容? 或者,你的所有数据元素只有一个名称空间?

你有什么标准化的机制来将属性和元素映射到某种一致的Json格式,或者你是否避免在你的XML中的属性?

您是否为每个表示创build不同的端点 ,还是使用内容协商来提供所需的格式? 你有一个默认的格式?

如果在可编辑资源上使用caching并使用不同的URL,那么如何确保当一个表示无效时其他表示也失效?

你觉得支持多种格式的好处是值得所需的努力

回应摘要:

所以主要原因似乎是偏好之一。 有些开发人员更喜欢花括号,有些更喜欢尖括号。

有些人希望从XML迁移到Json,因此支持这两者是向后兼容所必需的。

有些人想使用Json,但担心一些开发人员会害怕Json,所以他们都支持这两个,以免得罪任何人。

在框架XYZ中很容易打开这个function,所以为什么不呢?

另一个有趣的推荐原因是,JSON可以用来提供一个快速的脏数据摘要,XML可以用作语义丰富的完整表示。

Json通常适用于客户端脚本。 这是一个超级轻量级​​的响应,大部分JavaScript框架都带有一个内置的parsing器。 另一方面,许多服务器端应用程序和语言仍然严重依赖于XML。 仅举一个例子:Java。

当然,XML可以使用JavaScript进行分析,Java(以及大部分其他编程语言)至less有一个Jsonparsing器。 但目前这似乎是最常见的做法。

在谈到“实现vs利益”主题时,我主要使用Ruby,我可以告诉你,Ruby on Rails提供了在不到几秒钟内从相同源创buildJson或XML响应的能力。 在这种情况下,这不是一个问题,我通常添加该function,如果我认为它可能是有用的。

使用其他技术,例如PHP,需要付出更多的努力,并且实施会有不同的成本。 除非这是一个基本的function,否则我可能会坚持一个响应,直到我不觉得需要提供不同的版本。

与迄今为止所说的完全不同的原因 –

REST接口关于资源,每个资源都有一个标识符,这些标识符是URL。 仅仅因为你想要一个不同的序列化资源,不pipe是XML,JSON,HTML还是其他的东西,我们仍然在描述相同的资源。

因此,我们使用“Accept”头来确定客户端感兴趣的内容,而不是给XML和JSON一个不同的path。在某些情况下,服务使用“Accept-Language”头来确定什么语言他们应该使用他们的元数据。

如果我们为logging的不同序列化分配不同的标识符,那么对于语义networking,我们必须embedded额外的信息来链接到描述“相同”对象的所有logging。

您可以在“ 关联数据 ”一词下find关于这些工作的更多信息,尽pipe这通常是指在序列化中使用RDF。

更新 :关于链接到特定格式的讨论,我还build议人们考虑阅读“书目loggingfunction需求” (又名FRBR),它具有“书”作为抽象的“工作” ,物质“物品”,以及两者之间的等级。 FRBR的图书馆,信息和语义networking社区已经进行了一些讨论 ,包括它与数字对象的关系。

基本上,问题是您可以在多个级别分配标识符(例如,资源,关于资源的元数据的文本,或关于资源的元数据的文本的序列化),并且各自具有它们自己的使用。

您可能还会看到OAI-ORE报告对象之间报告关系的规范,包括备用格式或语言。

我自己写了一篇关于REST,SOAP,POX和JSON Web服务历史的详细文章。 基本上详细说明了不同选项的存在和好处,不幸的是,在这里列出所有的内容太长了。

基本上XML是更详细,更严格和可validation的,这使得它成为互操作性的一个很好的候选者,但是对于大部分编程语言而言,这并不是一个适合程序devise的伟大工具。 它也支持可以在XSD / DTD文档中find的模式概念(即关于数据的元数据)。 WSDL是XSD的扩展,也支持描述无限细节的Web服务(即SOAP Web服务)。

JSON是更轻量级,松散types的文本格式,就像有效的“序列化JSON”一样,为JavaScript提供最佳的程序devise适合性,因为JSONstring可以本地eval()编辑成JavaScript对象。 缺乏命名空间和概念属性/元素使它更适合于大多数其他编程语言。 不幸的是,它只支持基本types:数字,string,布尔值,对象和数组。 这并不是互操作性的最佳select。

我有一些Northwind数据库基准testing比较两者,它看起来像XML平均等效数据集的JSON大小的两倍 。 虽然如果您的XML文档包含许多不同的名称空间,有效载荷可能会大大超出这个范围。

我没有直接了解这一点,因为我只生成REST接口。 为“内部”消费。

我猜测公共API的提供者只是“对冲他们的赌注” ,在这个不断发展,快节奏和竞争激烈的环境中。

此外,为了处理相对简单的对象模型 (其中大部分可能是这些模型 ),处理这两种格式的额外努力可能是最小的,因此是值得的。

我认为“为什么人们这样做”是相当情景化的。 如果为潜在的广泛客户开发应用程序,支持多种内容types可能会增加市场性 – 既可以理解不同types的内容,也可以理解不同的内容types,但支持当今最新stream行语。

支持两者的一些理由可能在技术上更合理。 应用程序可能需要ajaxy浏览器客户端能够获取页面信息(JSON会更好),还可能需要支持一些独立的API客户端,这些客户端可能会进行后台处理或批处理,因此XML库更方便。

我希望使用内容协商优先于不同的端点,因为使用不同的端点会为REST资源提供同一资源的多个URI,这可能会造成模糊,有时令人困惑的API。

最后,我认为“值得付出”的价值完全取决于你是否知道你可以获得投资回报以支持多种内容types。 如果没有人会使用两种内容types之一,为什么同时支持? 当然,他们可能会很酷,但在很多情况下,也可能属于YAGNI。

我不会读得太多。 我认为有些开发人员比较喜欢一个开发人员(特别是取决于你的框架),提供这两者相当容易。

我所见过的大多数采用这种方法的API都不用担心XML名称空间

真的很多开发人员不了解JSON。 我知道轻量级轻松等等,但是很多程序员不想花费周期来解决问题。 他们知道XML,他们对此感到满意,而在一天结束的时候,这真的是他们想要使用的。 JSON也有与JavaScript相关的这种耻辱,这自然会使很多人感到不幸。

支持这两个方面真的取决于你正在编写API的读者,如果很多使用旧技术的商业程序员,那么是的,值得支持。 如果你想为靠近边缘的科技行业构build它,那么它可能不值得支持XML。 在我工作的地方,我们必须同时支持,这对我们来说是值得的。 我们知道我们的客户和他们想要什么,他们支付我们为他们提供。

在许多情况下,服务是从XMP / SOAP开始的,这是几年前的唯一解决scheme。 然而最近(过去两年左右),JSON变得越来越stream行,所以大多数服务都决定支持JSON,而且由于他们已经有了一个XML接口,

就个人而言,我更喜欢只服务于JSON,因为它避免了对带宽的angular度税。 另外,JSON是一个非常精简的规范,也是很有吸引力的。

从经验来看,Java和C#开发人员喜欢将XML反映到对象中; 这会产生一种静态types的欣快效果,因为JSON更容易出现dynamic行为(即神秘主义或口齿不清),所以事情不会出错。

PHP和Ruby程序员往往不在意。

AJAX开发人员更喜欢JSON,因为eval()是他们的parsing器(这是内置的和快速的)。

这取决于你的服务将如何被消耗。 我目前正在开发一个服务,它提供了JSON和XML。

  1. 由于我的一些客户将是移动应用程序,因此JSON非常适合他们 – 与XML相比,需要较less的处理能力来parsingJSON。
  2. 我的一些客户将会是使用JavaScript的网页。 由于JSON是Java Script中的头等公民,并且由于我们无法真正确定浏览器运行的系统的计算能力,所以JSON非常合理。
  3. 其他客户端是服务器端组件,他们可以轻松地处理XML,由于该团队的开发人员熟悉XML,他们更喜欢XML。

因此,为了我的服务,这些客户端的组合,JSON和XML都是非常有意义的。

我们使用accept头来确定返回的响应types。 与jackson一起使用泽西岛使其变得非常简单。 不需要分别处理每一个的特殊编码。 我们不使用名称空间,也不使用属性。