Web Application Description Language
1 介绍
1.1 网络应用程序
1.2 用例
1.3 WADL 描述示例
<?xml version="1.0"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl.xsd"
xmlns:tns="urn:yahoo:yn"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:yn="urn:yahoo:yn"
xmlns:ya="urn:yahoo:api"
xmlns="http://wadl.dev.java.net/2009/02">
<grammars>
<include
href="NewsSearchResponse.xsd"/>
<include
href="Error.xsd"/>
</grammars>
<resources base="http://api.search.yahoo.com/NewsSearchService/V1/">
<resource path="newsSearch">
<method name="GET" id="search">
<request>
<param name="appid" type="xsd:string"
style="query" required="true"/>
<param name="query" type="xsd:string"
style="query" required="true"/>
<param name="type" style="query" default="all">
<option value="all"/>
<option value="any"/>
<option value="phrase"/>
</param>
<param name="results" style="query" type="xsd:int" default="10"/>
<param name="start" style="query" type="xsd:int" default="1"/>
<param name="sort" style="query" default="rank">
<option value="rank"/>
<option value="date"/>
</param>
<param name="language" style="query" type="xsd:string"/>
</request>
<response status="200">
<representation mediaType="application/xml"
element="yn:ResultSet"/>
</response>
<response status="400">
<representation mediaType="application/xml"
element="ya:Error"/>
</response>
</method>
</resource>
</resources>
</application>
2.描述 组件
http://wadl.dev.java.net/2009/02
2.1 交叉引用
#someid
。跨文档引用使用 URI 来标识文档,并使用片段标识符来标识被引用文档中的组件,例如 somefile.wadl#someid
。允许使用绝对 URI 或相对 URI。2.2 应用
application
元素构成 WADL 描述的根并包含以下内容:2.3 文档
doc
可用于记录该元素的子元素。该doc
元素具有以下属性:xml:lang
title
定义属性值和元素内容的语言doc
。如果一个元素包含多个doc
元素,那么它们的xml:lang
属性必须具有不同的值。title
doc
元素具有混合内容,并且可能包含文本和零个或多个构成文档正文的子元素。建议子元素是 XHTML[ 2 ] 的文本、列表或表格模块的成员。2.4 语法
grammars
元素充当 WADL 文档描述的协议执行期间交换数据格式定义的容器。此类定义可以内嵌或通过使用include
元素的引用来包含(参见第 2.4.1节)。没有强 制规定特定的数据格式定义语言;第 3节和第 4 节分别描述了 RelaxNG 和 W3C XML Schema 与 WADL 的使用。2.4.1 包括
include
元素允许通过引用包含一个或多个数据格式描述的定义。该href
属性为引用的定义提供 URI,其类型为xsd:anyURI
。使用该include
元素在逻辑上相当于将引用的文档内联到 WADLgrammars
元素中。2.5 Resources
resources
元素充当应用程序提供的资源的容器。元素resources
具有base
类型属性xsd:anyURI
,该属性为每个子资源标识符提供基本 URI。后代resource
元素(参见第 2.6 节)描述应用程序提供的资源。2.6 Resource
resource
描述一组资源,每个资源都由遵循通用模式的 URI 标识。元素resource
具有以下属性:id
xsd:ID
标识元素的类型的可选属性resource
。path
xsd:string
。如果存在,它会提供资源标识符的相对 URI 模板。resource
资源的基本 URI 由元素的父元素resource
或元素给出resources
。queryType
resource
元素包含以下子元素:doc
元素 - 请参阅第 2.3 节。param
元素(参见第 2.12 节),其属性具有以下值之一style
:template
param
元素将被忽略。matrix
query
method
为资源的所有子元素指定全局 URI 查询参数。不适用于从resource_type
指定使用type
属性继承的方法。header
method
指定在资源的所有子元素的请求部分中使用的全局 HTTP 标头。不适用于从resource_type
指定使用type
属性继承的方法。method
(参见第 2.8 节)元素,每个元素描述可应用于资源的 HTTP 协议方法的输入和输出。这种本地定义的方法被添加到resource_type
使用该type
属性引用的元素中包含的任何方法中。resource
描述子资源的元素。此类子资源从父资源继承矩阵和模板参数,因为它们的 URI 相对于父资源的 URI,但它们不继承为父资源全局指定的查询或标头参数。path
可以是静态的,也可以包含嵌入的模板参数。在运行时,当使用资源时,模板参数的值会被替换为资源标识符,详细示例请参见第 2.6.1节。param
元素来传达,该子元素的属性值与模板中嵌入的参数的名称相匹配。例如,下面的模板参数的类型由子元素指定:style``name``widgetId``param
1 <resource path="widgets/{widgetId}">
2 <param name="widgetId" style="template" type="xsd:int"/>
3 ...
4 </resource>
2.6.1 生成资源标识符
resource
是使用以下规则获取的:1.
identifier
等于为父元素(resource
或resources
)计算的 URI(使用此过程)。2.
identifier
不以“/”结尾,则附加一个“/”字符identifier
。3.
path
值。4.
identifier
。5.
style
属性值的子param
元素(参见2.12节),按以下规则将参数值表示附加到标识符上:name
'='value
name
(当value
为true
时)。当value
为false
时,从标识符中省略。name
是param
元素的name
属性的值,value
是参数的运行时值1 <resources base="http://example.com/">
2 <resource path="widgets">
3 <resource path="reports/stock">
4 <param name="instockonly" style="matrix"
5 type="xsd:boolean"/>
6 ...
7 </resource>
8 <resource path="{widgetId}">
9 ...
10 </resource>
11 ...
12 </resource>
13 <resource path="accounts/{accountId}">
14 ...
15 </resource>
16 </resources>
widgetId
组件在运行时替换为名为 的运行时参数的值。2.7 资源类型
resource_type
描述了一组方法,这些方法共同定义了一类资源的行为。resource_type
可用于定义预期由多个资源支持的资源行为。resource_type
具有以下属性:id
xsd:ID
标识元素的类型的必需属性resource_type
。resource_type
元素包含以下子元素:doc
元素 - 请参阅第 2.3 节。param
元素(参见第 2.12 节),其属性具有以下值之一style
:query
header
method
(参见第 2.8 节)元素,每个元素都描述可以应用于该类型资源的 HTTP 协议方法。resource
描述此类资源的子资源的元素。path
此类子资源的 URI 由元素的属性提供resource
,并且相对于父资源的 URI。2.8 方法
method
描述可应用于资源的HTTP协议方法的输入和输出。元素method
可以是方法定义,也可以是对其他地方定义的方法的引用。2.8.1 方法参考
method
的子元素。属性的值是对定义元素的交叉引用(参见第2.1节)。引用元素不得具有任何其他 WADL 定义的属性或包含任何 WADL 定义的子元素。method
当相同的方法应用于多个资源时,可以使用这种形式的元素来减少重复。2.8.2 方法定义
name
id
method
具有相同属性值的子元素;name
这些同级代表同一 HTTP 方法的不同变体,并且通常具有不同的输入数据。method
元素具有以下子元素:doc
doc
元素 - 请参阅第 2.3 节。request
response
response
描述方法可能输出的元素 - 请参阅第 2.10 节。2.9 要求
request
描述将 HTTP 方法应用于资源时要包含的输入。元素request
没有属性,可以包含以下子元素:1.
doc
元素 - 请参阅第 2.3 节。2.
representation
元素 - 请参阅第 2.11 节。请注意,元素的使用representation
仅限于接受请求中的实体正文的 HTTP 方法(例如,PUT 或 POST)。同级representation
元素表示逻辑上等效的替代方案,例如,特定资源可能支持特定请求的多个XML语法。2.9.1 查询参数
style
值为 query
的子 param
元素(参见 2.12 节)表示 HTML 4.01[3] 17.13 节中描述的 URI 查询参数。在调用 HTTP 方法时,查询参数的运行时值作为 URI 查询参数发送。1 <resources base="http://example.com/widgets">
2 <resource path="{widgetId}">
3 <param name="customerId" style="query"/>
4 <method name="GET">
5 <request>
6 <param name="verbose" style="query" type="xsd:boolean"/>
7 </request>
8 <response>
9 ...
10 </response>
11 </method>
12 </resource>
13 </resources>
widgetId
参数的值是 123456
,customerId
参数的值是 cust1234
,verbose
参数的值是 true
,那么 HTTP GET 将在以下 URI 上执行:http://example.com/widgets/123456?customerId=cust1234&verbose=true
2.10 响应
response
描述对资源执行 HTTP 方法所产生的输出。它具有以下属性:status
response
元素可以包含以下子元素:doc
元素(参见第 2.3 节)。representation
元素(参见 2.11 节),每个表示元素描述了执行方法可能产生的资源表示。同级表示元素表示逻辑等价的备选方案;可以使用正常的 HTTP 内容协商机制来选择特定的备选方案。header
,每个元素指定响应的 HTTP 头部详情。2.11表示
representation
描述资源状态的表示。元素representation
可以是表示定义,也可以是对其他地方定义的表示的引用。2.11.1 表示参考
xsd:anyURI
的 href
属性。href
属性的值是一个交叉引用(参见 2.1 节),指向一个表示定义元素。表示引用元素不能有任何其他 WADL 定义的属性,也不能包含任何 WADL 定义的子元素。representation
元素可用于减少重复。2.11.2 表示定义
id
mediaType
text/*
)是可接受的,并表示支持指定范围内的任何媒体类型。element
grammars
节中所述 - 请参阅 2.4 节。profile
profile
属性,给出一个或多个元数据配置文件的位置,以空格分隔。元数据配置文件定义了后代 link 元素的 rel
和 rev
属性的含义(参见2.12.4节)。representation
定义元素还可以有零个或多个子doc
元素(请参阅第 2.3 节)和param
元素(请参阅第 2.11.3 节)。2.11.3 表示参数
param
元素(参见第 2.12 节)用于参数化其父representation
元素。根据表示的媒体类型,表示参数可以具有两种不同功能之一:1.
representation
的元素mediaType
,表示参数定义根据媒体类型格式化的表示内容。这同样适用于其他媒体类型。2.
path
指示表示中参数值的路径。对于基于 XML 的表示,这是一个 XPath 表达式。2.12 参数
param
描述其父元素的参数化组件。元素param
可以是参数定义,也可以是对其他地方定义的参数的引用。2.12.1 参数参考
param
元素,它有一个 href
属性,其类型是 xsd:anyURI
。href
属性的值是对一个 param
定义元素的引用(参见第2.1节)。一个参数引用元素不能有任何其他 WADL 定义的属性或包含任何 WADL 定义的子元素。param
当相同的参数应用于多个父代时,这种形式的元素可用于减少重复。2.12.2 参数定义
param
元素描述其父元素的参数化组件,并且可以是resource
(参见第 2.6 节)、application
(参见第 2.2 节)、request
(参见第 2.9 节)、response
(参见第 2.10 节)或representation
(参见第 2.11 节)元素的子元素。定义param
元素具有零个或多doc
个子元素(请参阅第 2.3 节)、零个或多option
个子元素(请参阅第 2.12.3 节)、一个可选link
子元素(请参阅第 2.12.4 节),并具有以下属性:id
name
type
xsd:string
。default
path
representation
元素时,此属性可以选择提供表示中参数值的路径。对于 XML 表示,建议使用 XPath 1.0 [4 ]。required
repeating
fixed
param
具有style
“matrix”值和required
“true”值的元素可能是不明智的。值 | param 的父元素 | 用法 |
---|---|---|
matrix | 资源 | 指定矩阵 URI 组件。 |
header | 资源、resource_type、请求或响应 | 指定与 HTTP 请求(资源或请求)或 HTTP 响应(响应)相关的 HTTP 标头 |
query | 资源、资源类型或请求 | 指定根据 queryType 属性指定的查询组件媒体类型的规则表示的 URI 查询参数。 |
query | 表示 | 将表示的一个组件指定为根据媒体类型规则格式化的名称值对。通常与媒体类型“application/x-www-form-urlencoded”或“multipart/form-data”一起使用。 |
template | 资源 | 该参数被表示为参数值的字符串编码,并被替换为资源元素的路径属性的值,如第 2.6.1 节中所述。 |
plain | 表示 | 根据媒体类型的规则指定格式化为参数值的字符串编码的表示形式的组成部分。 |
2.12.3 选项
option
为其父param
元素所表示的参数定义一组可能值中的一个。一个option
元素具有以下属性:value
mediaType
value
属性给出的值时所期望的媒体类型。<method name="GET">
<request>
<param name="format" style="query">
<option value="xml" mediaType="application/xml"/>
<option value="json" mediaType="application/json"/>
</param>
...
</request>
<response>
<representation mediaType="application/xml"/>
<representation mediaType="application/json"/>
</response>
</method>
option
元素可以有零个或多个doc
记录值含义的元素。2.12.4 关联
link
用于标识表示中的资源链接。link
元素是 param
元素的子元素,其 path
属性标识包含链接 URI 的父表示的部分。link
元素包含零个或多个doc
元素(参见第 2.3 节)并具有以下属性:resource_type
resource_type
元素。rel
profile
属性的值约束。rev
rel
属性标识的关系的反向关系。值受祖先表示元素 profile
属性的值约束。<!-- 基于 XML 的小部件表示 -->
<w:widget xmlns:w="http://example.com/widgets">
<w:loc>http://example.com/widgets/110113</w:loc>
<w:name>一个小部件</w:name>
<w:description>一个非常有用的小装置。</w:description>
<w:price currency="USD">19.99</w:price>
<w:list>http://example.com/widgets</w:list>
</w:widget>
<!-- 不带参数的小部件表示的 WADL 片段 -->
<representation mediaType="application/xml"
element="w:widget"/>
<!-- 带参数的小部件表示的 WADL 片段 -->
<representation mediaType="application/xml"
element="w:widget">
<param name="location" style="plain"
type="xsd:anyURI" path="/w:widget/w:loc">
<link resource_type="#widget" rel="self"/>
</param>
<param name="index" style="plain"
type="xsd:anyURI" path="/w:widget/w:list">
<link resource_type="#widgets" rel="index" rev="child"/>
</param>
</representation>
id
为"widget"的 WADL resource_type
元素描述。id
为"widgets"的 WADL resource_type
元素描述。2.13 可扩展性
3 将 RelaxNG 与 WADL 结合使用
grammars
元素内或者可以通过使用元素的引用来包括include
。可以使用 RelaxNG 提供的工具(例如rng:include
)将多个 RelaxNG 模式组合在单个模式中。 所包含的 RelaxNG 语法的默认命名空间是 WADLgrammars
元素的默认命名空间。element
元素的属性是representation
指使用元素的XML限定名的对应的RelaxNG元素模式。4 将 W3C XML 架构与 WADL 结合使用
grammars
元素中,或者可以通过使用include
元素的引用来包含。xsd:include
可以使用 W3C XML 模式(例如)提供的工具将多个 W3C XML 模式组合在单个模式中。element
元素的属性是representation
指使用元素的 XML 限定名称的相应 W3C XML Schema 全局元素声明。5 WADL 媒体类型
application/vnd.sun.wadl+xml
媒体类型并使用.wadl
文件扩展名来提供。有关完整详细信息,请参阅 WADL 媒体类型注册 [5 ]。A其他示例
A.1亚马逊商品搜索
1 <application xmlns="http://wadl.dev.java.net/2009/02"
2 xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-07-26"
3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl.xsd">
6
7 <grammars>
8 <include href="AWSECommerceService.xsd"/>
9 </grammars>
10
11 <resources base="http://webservices.amazon.com/onca/">
12 <resource path="xml">
13 <method href="#ItemSearch"/>
14 </resource>
15 </resources>
16
17 <method name="GET" id="ItemSearch">
18 <request>
19 <param name="Service" style="query"
20 fixed="AWSECommerceService"/>
21 <param name="Version" style="query" fixed="2005-07-26"/>
22 <param name="Operation" style="query" fixed="ItemSearch"/>
23 <param name="SubscriptionId" style="query"
24 type="xsd:string" required="true"/>
25 <param name="SearchIndex" style="query"
26 type="aws:SearchIndexType" required="true">
27 <option value="Books"/>
28 <option value="DVD"/>
29 <option value="Music"/>
30 </param>
31 <param name="Keywords" style="query"
32 type="aws:KeywordList" required="true"/>
33 <param name="ResponseGroup" style="query"
34 type="aws:ResponseGroupType" repeating="true">
35 <option value="Small"/>
36 <option value="Medium"/>
37 <option value="Large"/>
38 <option value="Images"/>
39 </param>
40 </request>
41 <response>
42 <representation mediaType="text/xml"
43 element="aws:ItemSearchResponse"/>
44 </response>
45 </method>
46 </application>
A2原子发布协议
<service xmlns="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom">
<workspace>
<atom:title>主站点</atom:title>
<collection
href="http://example.org/blog/main" >
<atom:title>主站点</atom:title>
</collection>
<collection
href="http://example.org/blog/pic" >
<atom:title>图片</atom:title>
<accept>image/*</accept>
</collection>
</workspace>
</service>
<application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:app="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom">
<grammars>
<include href="http://www.w3.org/2007/app/app.xsd"/>
</grammars>
<resource_type id="entry_feed">
<method href="#getFeed"/>
<method href="#addEntryCollectionMember"/>
</resource>
<resource_type id="media_feed">
<method href="#getFeed"/>
<method href="#addImageCollectionMember"/>
</resource>
<resource_type id="entry">
...
</resource_type>
<representation id="entry" mediaType="application/atom+xml"
element="atom:entry"/>
<representation id="feed" mediaType="application/atom+xml"
element="atom:feed">
<param name="first_link" style="plain"
path="/atom:feed/atom:link[@rel='first']">
<link resource_type="#entry_feed" rel="first"/>
</representation>
<param name="next_link" style="plain"
path="/atom:feed/atom:link[@rel='next']">
<link resource_type="#entry_feed" rel="next" rev="previous"/>
</param>
<param name="prev_link" style="plain"
path="/atom:feed/atom:link[@rel='previous']">
<link resource_type="#entry_feed" rel="previous" rev="next"/>
</param>
<param name="last_link" style="plain"
path="/atom:feed/atom:link[@rel='last']">
<link resource_type="#entry_feed" rel="last"/>
</param>
</representation>
<method name="GET" id="getFeed">
<response>
<representation href="#feed"/>
</response>
</method>
<method name="POST" id="addEntryCollectionMember">
<request>
<representation href="#entry"/>
</request>
<response status="201">
<param name="location" style="header" type="xsd:anyURI"
required="true">
<link resource_type="#entry" rel="self"/>
</param>
<representation href="#entry"/>
</response>
</method>
<method name="POST" id="addImageCollectionMember">
<request>
<representation mediaType="image/*"/>
</request>
<response status="201">
<param name="location" style="header" type="xsd:anyURI"
required="true">
<link resource_type="#entry" rel="self"/>
</param>
<representation href="#entry"/>
</response>
</method>
</application>
<application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:app="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom">
<resources base="http://example.org/">
<resource path="blog/main"
type="http://www.w3.org/2007/app.wadl#entry_feed">
<doc title="主站点"/>
</resource>
<resource path="blog/pic"
type="http://www.w3.org/2007/app.wadl#media_feed">
<doc title="图片"/>
</resource>
</resources>
</application>
http://example.org/blog/main
此资源支持 HTTP GET 来检索 Atom 提要文档,并支持 HTTP POST 来向提要添加新条目。
http://example.org/blog/pic
此资源支持 HTTP GET 来检索 Atom 提要文档,并支持 HTTP POST 来将新图像添加到提要中。