RESTful 服务 - WSDL 等价物
Posted
技术标签:
【中文标题】RESTful 服务 - WSDL 等价物【英文标题】:RESTful Services - WSDL Equivalent 【发布时间】:2011-05-05 22:16:42 【问题描述】:我一直在阅读有关 REST 和 SOAP 的文章,并了解为什么实施 REST 比使用 SOAP 协议更有益。但是,我仍然不明白为什么 REST 世界中没有“WSDL”等价物。我看到帖子说 WSDL “不需要”,或者在 REST 世界中它是多余的,但我不明白为什么。以编程方式绑定到定义并创建代理类而不是手动编码不是总是有用的吗?我并不是要进行哲学辩论,只是寻找 REST 中没有 WSDL 的原因,或者为什么不需要它。谢谢。
【问题讨论】:
我也有同样的问题。从客户的角度来看,restful 服务似乎比 WSDL 服务更难使用。 在我看来,如果您要公开一些简单的东西,那么您就不需要 WADL 或 WSDL。但是如果你要暴露像 SAP 这样复杂的东西......我无法理解没有某种反射和命名空间来处理过多的功能。 不能将 HTTP OPTIONS 方法视为“等效”方法,因为它应该提供有关任何可能操作所需的可用方法和参数的信息? 【参考方案1】:Web Application Description Language (WADL) 基本上等同于 RESTful 服务的 WSDL,但是否需要这样的东西一直存在争议。
Joe Gregorio 写了 a nice article about that topic,值得一读。
【讨论】:
谢谢乔斯基。我阅读了这些文章,但没有发现第二个太有说服力。您认为他提到的哪些点最有价值? 值得注意的是,.NET 还有一种发布元数据的方法 (msdn.microsoft.com/en-us/library/ms730243.aspx)。话虽如此,我看到的大多数由大型网站开发的 REST 服务都包括为主要编程语言(Java、.NET、php 等)开发的各种可下载客户端。在我看来,这给服务提供商带来了很大的负担。 @dana:编写一个需要你同时编写客户端的服务似乎没什么意义?【参考方案2】:以编程方式绑定到定义不是总是有用的吗? 创建代理类而不是手动编码?
完全同意,这就是我使用Swagger.io的原因
Swagger 是一个强大的开源框架,由大型 帮助您设计、构建、记录和使用的工具生态系统 您的 RESTful API。
所以基本上我使用 Swagger 来描述我的模型、端点等,然后我使用 swagger-codegen 等其他工具来生成代理类,而不是手动编码。
另见:RAML
【讨论】:
不知道 Swagger 也这样做了。以为这只是 REST API 的文档/通用框架【参考方案3】:WSDL 2.0 规范也增加了对 REST Web 服务的支持。两全其美的场景。问题是 WSDL 2.0 还没有得到大多数工具的广泛支持。 WSDL 2.0 是 W3C 推荐的,WSDL1.1 不是 W3C 推荐的,但得到工具和开发人员的广泛支持。 参考: http://www.ibm.com/developerworks/library/ws-restwsdl/
【讨论】:
【参考方案4】:RSDL 的目标是像超媒体一样转休息,换句话说,它比 WSDL 或 WADL 之类的服务描述符拥有更多的信息。例如,它具有有关导航的信息,如超文本和超链接。
例如,给定一个当前资源,你有一组 os 链接到另一个相关的资源。
但是,我没有找到支持这种格式的 Rest Clients 或具有自动生成它的功能的 Rest Server Solutions。
我认为关于它的结论还有很长的路要走。请参阅 html 长篇故事和 W3C vs Browsers 哈哈。
有关 Rest like Hypermedia 的更多详细信息,请查看:http://en.wikipedia.org/wiki/HATEOAS
注意:Roy Fielding 一直在批评没有 hypermidia 方法的 Rest APIs 中的这些趋势:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
我的结论:现在,WADL 比 Camel CXF 等 Rest 和集成框架已经支持 WADL(生成和消费)更常见,因为它类似于 WSDL,因此在这个迁移过程中最容易理解(SOAP 到休息)。
让我们看看接下来的章节;)
【讨论】:
【参考方案5】:有一种等效于 WSDL 的 RSDL(RESTful 服务描述语言)。下面的 URL 描述了它的实践 http://en.wikipedia.org/wiki/HATEOAS 和 http://en.wikipedia.org/wiki/RSDL。 问题是我们有很多工具可以将代码从 wsdl 生成到 java 或反向。 但是我没有找到任何从 RSDL 生成代码的工具。
【讨论】:
【参考方案6】:Web 应用程序描述语言 (WADL) 是一个 XML 词汇表,用于描述 RESTful Web 服务。
与 WSDL 一样,通用客户端可以加载 WADL 文件并立即具备访问相应 Web 服务的全部功能的能力。
由于 RESTful 服务具有更简单的接口,因此 WADL 对这些服务的必要性不如 WSDL 对 RPC 样式的 SOAP 服务的必要性。
【讨论】:
【参考方案7】:WSDL is extensible to allow description of endpoints and their messages regardless of what message formats or network protocols are used to communicate
但是,REST 通过使用 HTTP 动词和 URI 来表示对象状态,从而使用网络协议。
WSDL 在这里告诉您,如果您发送此消息,您将执行此操作并作为结果返回此格式。
在 REST 中,如果我想创建一个新的配置文件,我会使用动词 POST
和 JSON 正文或 http 服务器变量,将我的配置文件描述到 URL /profile
POST
应返回服务器端生成的 ID,使用状态码 201 CREATED
和标头 Location: *new_profile_id*
(例如 12345)
然后我可以使用 HTTP 动词 POST
执行更新以更改 /profile/12345
的状态,例如更改我的电子邮件地址或电话号码。显然改变了远程对象的状态。
GET
将返回/profile/12345
的当前状态
PUT
通常用于客户端生成的ID
DELETE
,很明显
HEAD
,获取状态而不返回正文。
使用 REST,它应该通过精心设计的 API 进行自我记录,因此更易于使用。
This is a great article 在 REST 上。它也确实帮助我理解它。
【讨论】:
我认为它是 REST 的超媒体约束,而不是消除对 WSDL 需求的统一接口约束。 在哪里发现“个人资料”?当你有几十个而不是一个时,你如何提供帮助?其他所有服务都依赖于手写文档和手动编写的 API,这些都是劳动密集型且容易出错的。 我同意@EricGrange - 请您解释一下您如何知道可以在哪些实体上执行 CRUD(L) 操作...除非有人在某处写下来?【参考方案8】:WSDL 描述服务端点。 REST 客户端不应耦合到服务器端点(即不应提前知道 URL)。 REST 客户端耦合在客户端和服务器之间传输的媒体类型上。
在客户端自动生成类以包装返回的媒体类型可能是有意义的。但是,一旦您开始围绕服务交互创建代理类,您就会开始掩盖 HTTP 交互并有可能退化回 RPC 模型。
【讨论】:
你能详细说明一下吗?恐怕我不明白。谢谢。 代理类是一种在编译时进行机器验证的方法。没有它们,您只有手动编写的文档和基于测试的“验证”。 @EricGrange ...但到目前为止,这种方法在网络上效果很好。 @DarrelMiller:来自银行背景,REST 没有任何好处。您需要强类型和编译时验证 - 否则您只是针对“某物”编写测试脚本......即使脚本集稍有错误,您也不会知道,直到为时已晚。 @BlueChippy Media-type 规格以老式方式处理。您要么为规范找到现有的解析器,要么阅读规范并自己编写一个。需要注意的重要一点是,目标是使媒体类型规范可跨 API 重用。为每个 API 编写一个新的解析器就无法理解这一点。正确完成 REST 会为客户端和服务器的独立发展带来长期利益。以上是关于RESTful 服务 - WSDL 等价物的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JMeter 调用你的 Restful Web Service?进行简单的压力测试和自动化测试