我一直在阅读有关REST和SOAP的文章,并了解为什么实现REST优于使用SOAP协议。但是,我仍然不明白为什么REST世界中没有等效的“ WSDL”。我看到过一些帖子,说“不需要” WSDL,否则在REST世界中将是多余的,但我不明白为什么。以编程方式绑定到定义并创建代理类而不是手动编码是否总是有用?我并不是要进行哲学辩论,只是要寻找REST中没有WSDL的原因,或者为什么不需要它。谢谢。
我一直在阅读有关REST和SOAP的文章,并了解为什么实现REST优于使用SOAP协议。但是,我仍然不明白为什么REST世界中没有等效的“ WSDL”。我看到过一些帖子,说“不需要” WSDL,否则在REST世界中将是多余的,但我不明白为什么。以编程方式绑定到定义并创建代理类而不是手动编码是否总是有用?我并不是要进行哲学辩论,只是要寻找REST中没有WSDL的原因,或者为什么不需要它。谢谢。
Answers:
对于RESTful服务,Web应用程序描述语言(WADL)基本上等同于WSDL,但是一直争论不休,是否根本需要这样的东西。
Joe Gregorio写了一篇有关该主题的不错的文章,值得一读。
WSDL描述了服务端点。REST客户端不应耦合到服务器端点(即,不应事先知道URL)。REST客户端耦合在客户端和服务器之间传输的媒体类型上。
在客户端上自动生成类以包装返回的媒体类型可能是有意义的。但是,一旦开始围绕服务交互创建代理类,就会开始使HTTP交互变得晦涩难懂,并有可能退化为RPC模型。
RSDL旨在像超级媒体一样转变休息状态,换句话说,它比诸如WSDL或WADL的服务描述符具有更多信息。例如,它具有有关导航的信息,例如超文本和超链接。
例如,在给定当前资源的情况下,您有一个指向其他相关资源的操作系统链接。
但是,我找不到支持这种格式的Rest Clients或具有自动生成功能的Rest Server Solutions。
我认为要得出结论还有很长的路要走。请参见HTML的长篇小说和W3C与浏览器的比较。
有关像Hypermedia这样的Rest的更多详细信息,请查看:http : //en.wikipedia.org/wiki/HATEOAS
注意:罗伊·菲尔丁(Roy Fielding)一直批评没有使用高迷症方法的Apis卧床的这些趋势:http ://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
我的结论:如今,WADL变得更加普遍,因为像Camel CXF这样的Rest和集成框架已经支持WADL(生成和使用),因为它类似于WSDL,因此在此迁移过程(从SOAP到REST)中最容易理解。
让我们看下一章;)
以编程方式绑定到定义并创建代理类而不是手动编码是否总是有用?
完全同意,这就是为什么我使用Swagger.io
Swagger是一个功能强大的开源框架,由大型工具生态系统支持,可帮助您设计,构建,记录和使用RESTful API。
因此,基本上,我使用Swagger来描述我的模型,端点等,然后使用其他工具(例如swagger-codegen)来生成代理类,而不是手动对其进行编码。
另请参阅:RAML
有一种与WSDL等效的RSDL(静态服务描述语言)。下面的URL描述了它的做法http://en.wikipedia.org/wiki/HATEOAS 和http://en.wikipedia.org/wiki/RSDL。问题是我们有很多工具可以将wsdl生成代码,也可以反向转换为java。但是我没有找到任何可以从RSDL生成代码的工具。
WSDL可扩展,以允许描述端点及其消息,而与使用哪种消息格式或网络协议进行通信无关
但是,REST通过使用HTTP动词和URI使用网络协议来表示对象状态。
WSDL在此告诉您,如果您发送此消息,则将执行此操作并将结果恢复为该格式。
在REST中,如果我想创建一个新的个人资料,则可以将该动词POST
与JSON主体或将我的个人资料描述到URL的http服务器变量一起使用/profile
POST
应该使用状态码201 CREATED
和标头返回服务器端生成的ID Location: *new_profile_id*
(例如12345)
然后,我可以执行更新,以更改/profile/12345
使用HTTP动词的状态POST
,例如更改我的电子邮件地址或电话号码。显然改变了远程对象的状态。
GET
将返回当前状态 /profile/12345
PUT
通常用于客户端生成的ID
DELETE
, 明显
HEAD
,无需返回身体即可获得状态。
使用REST时,应该通过设计良好的API自行记录文档,因此更易于使用。
WSDL 2.0规范也增加了对REST Web服务的支持。两全其美的方案。问题在于,目前大多数工具尚未广泛支持WSDL 2.0。推荐使用W3C WSDL 2.0,不推荐使用W3C WSDL1.1,但工具和开发人员广泛支持WSDL1.1。参考:http : //www.ibm.com/developerworks/library/ws-restwsdl/