使用WADL的原因是什么?

时间:2009-08-21 13:52:47

标签: rest wadl

为了描述RESTful,我们可以说每个资源都有自己的URI。使用HTTP GET,POST,PUT和DELETE,我们可以对这些资源进行操作。所有资源都具有代表性。谁想要使用我们的资源可以通过浏览器或REST客户端来实现。

这是RESTful架构的主要思想。这种架构允许互联网上的服务。那么为什么这个架构需要WADL呢? WADL提供的标准HTTP不是什么?为什么WADL需要存在?

8 个答案:

答案 0 :(得分:143)

WADL的目的是定义合同。合同规定了一方如何打电话给另一方。

从头开始创建Web应用程序时,您不需要合同和WADL

当您将系统与其他系统集成并且您可以与他们的开发团队清楚地沟通时,您不需要合同和WADL (因为您可以打个电话来清楚地说明)

但是,当您将复杂的企业系统与其他几个由不同公司(或联邦机构)维护的复杂企业系统集成时,请相信我您希望尽可能严格地定义通信合同。 然后你需要WADL或Open Specification。非常需要

企业背景薄弱的人倾向于将整个IT视为独立开发的独立Web应用程序的集合。但企业现实有时很艰难。有时,您甚至无法打电话或写信给开发您必须集成的应用程序的人员。有时您与不再维护的遗留应用程序进行通信 - 它只是运行,您需要弄清楚如何正确地与它进行通信。 在这种情况下,您需要合同,因为它可以节省您的屁股

实际上,客户端生成是合同定义的次要特征。这只是一个玩具。合同强制执行不良沟通者清楚地传达集成规则。这是使用WADL或Open Specification等的主要原因。

答案 1 :(得分:36)

使用WADL意味着您可能非常慷慨地实际定义您来回传递的数据/文档。假设您传递了一些XML片段,它们实际上可能是已定义架构的一部分。

您是否使用DL生成代码对我来说并不是很重要。在我的主观意见中,重要的是在业务合作伙伴之间就接口达成正式协议非常重要。即使传递的内容显而易见,如果有人更改了以前的界面,也有助于确定谁必须在以后修改内容。

数据格式与动词名称一样,也是界面的一部分。

答案 2 :(得分:28)

WADL吸引了来自SOAP世界的人们,在这里人们常常使用代码生成器来创建基于WSDL的客户端代码。我不认为该机制在REST中有用,因为它创建了耦合到服务器端点的客户端代码。

我相信如果您正确定义媒体类型并在这些媒体类型中使用超媒体,那么就没有必要使用WADL。可用端点的描述包含在媒体类型定义本身中。如果您现在对自己说,但application / xml不包含任何有关可用超链接的信息,那么我说BINGO。这就是为什么我认为application / xml和application / json不适合用于REST的媒体类型。我不是说不使用XML或JSON,只是不要使用通用媒体类型名称。

WADL的另一个吸引力是为了记录REST服务。不幸的是,当WADL尝试记录服务器端端点时,它会导致开发人员走错路。记录REST服务应主要关注媒体类型。客户端开发人员应该能够编写REST客户端,而不需要知道除根URL之外的任何URL。

答案 3 :(得分:16)

WADL允许您生成代码,测试和文档。实际上使用WADL的工具很少,你可以看到一些例子here。如Fielding的论文所述,“纯”REST的问题在于编写支持Hypermedia的客户端(例如,想象一下编写基于Java Swing的客户端应用程序)。使用WADL,这项任务是完全自动化的,在我看来这是一个巨大的优势。测试也变得更容易了。

答案 4 :(得分:16)

在我解释之前,请允许我说大多数纯粹的REST极端主义者会将它贬低到地球的尽头。我不同意他们,因为我宁愿完成某件事,但只是你知道。

WADL是对Web服务API的描述,有点像WSDL用于SOAP类型的Web服务,它被设计为更符合RESTful接口(WSDL很差)。

根据我的经验,它的主要用途是允许您生成可以调用服务的客户端代码(如果它是一个非常大的API,可以方便地节省数小时的工作)。它还用于记录类似REST的界面。

答案 5 :(得分:6)

答案 6 :(得分:3)

当您想公开REST服务时,最好的方法是生成WADL并与使用者共享(类似于基于SOAP的Web服务中的WSDL).WADL用于描述所有就地服务。

答案 7 :(得分:0)

不需要使用WADL。但是,如果您正在使用复杂的现有应用程序,并且希望通过替换EJB / SOAP服务调用来实现REST服务调用,那么使用WADL是非常安全和好的做法。通过使用WADL生成客户端Java存根,您将与服务同步。

您可以在wadl2java maven插件的帮助下使用WADL文件生成客户端Java存根。