我们正在设计一个相当复杂的REST API,其中大部分I / O都具有特定结构的JSON编码的对象。 我们发现的一个挑战就是以这样的方式,使得它更容易为客户发布正确的输入和输出过程中记录的API。 因为输入和输出的数据需要相当复杂的JSON对象,客户开发人员常常引入相关的I / O对象的结构缺陷。
与所有的JSON网络API的是,这些天,我会希望有一个通用的解决方案,但我有一个很难找到一个。 我看着JSON-模式这是一个JSON验证模式,但IETF草案,并实现双方似乎是相当不成熟的(即使他们已经有一段时间了,这是不是一个好兆头)。
稍微不同的方法是通过提供协议缓冲器和阿帕奇阿夫罗 ,其中该模式不用于确认,而是实际需要的消息的编码/解码。 这些2,Avro公司似乎也相当有限的文档和实现。 protobuf的似乎更好,但我不知道这是否真的适合在浏览器中使用调用JSON API?
现在,我开始怀疑,如果我从合适的角度看这个。 是否有其他方法可以让我的API多一点强typed'ish? 或者是一个JSON REST / RPC API的东西,违背了使用JSON的目的,一个正式的说明吗?
编辑:这个话题后6个月,我们发现猫鼬 ,这是非常接近我们了找谁。
下面的回复,我从道格拉斯克罗克福德通过电子邮件收到。
我不是在架构信徒作为替代输入验证。 有迹象表明,不能从语法验证属性。 我认为这是那XML出错的方式之一。
如果你的格式是太复杂了,那么我想看看他们简化。
这样的系统存在,我就是其中之一的作者。 这就是所谓的Piqi-RPC和它为RPC风格的API通过HTTP的输入和输出参数的基于IDL的验证。
它支持JSON,XML和谷歌协议缓冲器作为数据表示格式用于HTTP POST请求的输入和输出。 客户可以选择使用任意三种格式,并使用标准指定自己选择Accept
和Content-Type
HTTP标头。
所以,是的,从理论上讲,你正在寻找在正确的方向。 然而,此刻,Piqi-RPC只支持用Erlang编写的服务器,如果你使用不同的堆栈它不会对你非常有用。 听说阿帕奇节俭还支持通过HTTP传输的JSON,但我没有检查。 另一种类似的系统的,我知道的(也可用于二郎)被称为UBF 。 我听说库为Java,可以分析和基于Protocol Buffers的规格验证JSON(例如http://code.google.com/p/protostuff/ )。
这个想法本身是远远新的,但都不是那么接近它在实践中的许多系统。 这是一个具有挑战性的问题。
从历史上看,的IDL被用于接口定义和二进制数据序列化和没有那么多,用于验证其后来出现动态数据交换格式(例如XML和JSON)。 Sun-RPC的IDL和CORBA IDL落于第一类。 WSDL将覆盖这两个领域的少数例子之一,但它是一个可怕的技术产品,这将是对大多数现代系统中一个不错的选择。 此外,还有很多模式语言(也称为的DDL - 数据定义语言),其中大部分是高度专业化,只有一个表示格式,如XML或JSON模式工作。 那几个有稳定的实现。
该Piqi项目和Piqi-RPC,这是基于它,都是围绕打造几个非常简单的实现:
通过HTTP REST风格的API说起相比,RPC风格的API通过HTTP。
随着RPC风格的API,服务开发者或自动化系统必须确认三两件事:函数名(根据某些服务的命名方案),输入,如果你选择的话,输出。
在REST风格的API的情况下,人们让自己在没有很好的理由麻烦。 现在,他们有更多的东西来验证:任意复杂的URL语法,包括网址片段编码(适用于所有HTTP方法)动态参数和URL查询字符串(仅适用于HTTP GET方法),HTTP方法对应(是否应该GET ,POST,PUT,DELETE等),HTTP身体当一些参数去那里(有时他们做手工两次)的JSON和XML表示的参数,自定义HTTP标头,并单独 - 服务文档。 想象一下,一个IDL支持一切!
XML是在许多方面RESTful服务更好。 它具有本地连接( <link href=
,所有这些HATEOAS风扇),原生语言支持( lang="en"
)和一个伟大的生态系统。
这也是适应未来发展和未来的API重构更好。 这个转换:
<profile>
<username>alganet</username>
</profile>
为了支持更多的用户名:
<profile>
<username>alganet</username>
<username>alexandre</username>
</profile>
是更简单的做不破坏使用XML 的现有客户 。 JSON是很难上。
如果你真的需要JSON,JSON-Schema是要走的路。 这是不成熟的,但我不知道任何关于这种情况下更好。 也许你的消费者可以XML和JSON之间进行选择,这样他们就可以少量的有效载荷(JSON)或使用内容协商REST风格的糖果(XML)之间进行选择。
我想说的回答你的最后一个问题是肯定的。 如果您需要一种方法来约束和记录JSON“模式”,你为什么不使用XML去摆在首位? 这并不是说更难解析,并且能够强制执行的模式,因为这是一个很大的优势。