RESTful服务-等效WSDL


94

我一直在阅读有关REST和SOAP的文章,并了解为什么实现REST优于使用SOAP协议。但是,我仍然不明白为什么REST世界中没有等效的“ WSDL”。我看到过一些帖子,说“不需要” WSDL,否则在REST世界中将是多余的,但我不明白为什么。以编程方式绑定到定义并创建代理类而不是手动编码是否总是有用?我并不是要进行哲学辩论,只是要寻找REST中没有WSDL的原因,或者为什么不需要它。谢谢。


4
我也有同样的问题。从客户端的角度看来,宁静的服务要比WSDL服务难得多。
w.donahue 2010年

4
在我看来,如果您要公开一些简单的内容,则不需要WADL或WSDL。但是,如果您要公开像SAP这样复杂的内容...我无法理解没有某种类型的反射和名称空间来处理过多的功能。
Brain2000 2011年

HTTP OPTIONS方法不能被视为“等效”方法,因为它应该提供有关可能采取的措施所需的可用方法和参数的信息?
Dim13i 2014年

Answers:


44

对于RESTful服务,Web应用程序描述语言(WADL)基本上等同于WSDL,但是一直争论不休,是否根本需要这样的东西。

Joe Gregorio写了一篇有关该主题的不错的文章,值得一读。


1
谢谢Joschi。我读了这些文章,但没有发现第二个太令人信服。您发现他最有价值的几点是什么?
skaz 2010年

1
可能值得注意的是.NET还具有一种发布元数据的方法(msdn.microsoft.com/en-us/library/ms730243.aspx)。话虽如此,我看到的由大型站点开发的大多数REST服务都包括为主要编程语言(Java,.NET,PHP等)开发的各种可下载客户端。我认为,这给服务提供商带来了很多负担。
dana

4
@dana:编写服务然后要求您也编写客户端似乎没有多大意义?
BlueChippy 2012年

19

WSDL描述了服务端点。REST客户端不应耦合到服务器端点(即,不应事先知道URL)。REST客户端耦合在客户端和服务器之间传输的媒体类型上。

在客户端上自动生成类以包装返回的媒体类型可能是有意义的。但是,一旦开始围绕服务交互创建代理类,就会开始使HTTP交互变得晦涩难懂,并有可能退化为RPC模型。


4
您能再详细一点吗?恐怕我不明白。谢谢。
skaz 2010年

1
代理类是在编译时进行机器验证的一种方法。没有它们,您只能手动编写文档和基于测试的“验证”。
埃里克·格兰奇

1
@EricGrange ...但是到目前为止,这种方法在网络上已经非常有效。
Darrel Miller 2012年

1
@DarrelMiller取决于您所说的“工作得很好”,就像在80年代,每个人都用纸质文档写出互操作文档一样,它可以工作,但是“很好”吗?
埃里克·格兰奇

4
@BlueChippy媒体类型规范以老式方式处理。您可以为该规范找到一个现有的解析器,或者您可以阅读规范并自己编写。需要注意的重要一点是,目标是使媒体类型规范可以在API之间重用。为每个API编写一个新的解析器都无济于事。正确完成REST可以带来客户端和服务器独立发展的长期利益。
Darrel Miller

8

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)中最容易理解。

让我们看下一章;)


8

以编程方式绑定到定义并创建代理类而不是手动编码是否总是有用?

完全同意,这就是为什么我使用Swagger.io

Swagger是一个功能强大的开源框架,由大型工具生态系统支持,可帮助您设计,构建,记录和使用RESTful API。

因此,基本上,我使用Swagger来描述我的模型,端点等,然后使用其他工具(例如swagger-codegen)来生成代理类,而不是手动对其进行编码。

另请参阅:RAML


不知道Swagger也这样做了。以为那只是REST API的文档/通用框架
Robert Dundon


3

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自行记录文档,因此更易于使用。

这是有关REST 的精彩文章。它确实也帮助我理解了它。


2
我认为这是REST的超媒体约束,而不是不需要WSDL的统一接口约束。
Darrel Miller

3
您在哪里发现“个人资料”?如果您有几十个而不是一个,您将如何提供帮助?那里的所有其他服务都依赖于手写文档和手动编写的API,这些都是劳动密集型且容易出错的。
埃里克·格兰奇

1
我同意@EricGrange-请您能解释一下,您怎么知道可以在哪些实体上执行CRUD(L)操作...除非有人在某个地方写下来?
BlueChippy 2012年


0

Web应用程序描述语言(WADL)是用于描述RESTful Web服务的XML词汇表。

与WSDL一样,通用客户端可以加载WADL文件并立即具备访问相应Web服务的全部功能的能力。

由于RESTful服务具有更简单的接口,因此WADL对于这些服务的需求几乎不如WSDL对RPC样式的SOAP服务的需求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.