清单 11: 调用 ESRI 的地址请求 Web 服务之后的语义响应
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<ServiceResponse>
<Service Name="AddressFinder">
<Function Name="findAddress">
<InputVariables>
<address>
<houseNumber>888</houseNumber>
<street>Willey St</street>
<city>Morgantown</city>
<state_prov>WV</state_prov>
<zone>26505</zone>
</address>
<datasource>GDT.Streets.US</datasource>
<username>[username]</username>
<password>[password]</password>
</InputVariables>
<OutputResult>
<NumberOfCandidates>1</NumberOfCandidates>
<Location>
<LocationDescription>888 Willey
St, Morgantown, WV 26505</LocationDescription>
<longitude>-79.946623</longitude>
<latitude>39.635351 </latitude>
</location>
</OutputResult>
</Function>
</Service>
</ServiceResponse>
其中,最重要的是,语义请求和响应可以隐式调用 Web 服务的实现细节,如清单 10 和 11 所示。 传统调用方式如 清单 10 所示,服务请求者不得不通过传递必须的变量(用户名、密码、有效时间)来调用另外一个名为 Authentication 的服务,以此获得一个令牌来作为获得访问 ArcWeb 服务的身份确认。为获取位置信息(经度和纬度),服务请求者必须首先通过调用地址查找 Web 服务以获取一个 LocationInfo 对象,然后产生一个 location 对象来从候选的 LocationInfo 对象中获取经度和纬度的值。通过语义响应,如 清单 11 所示,服务请求者可以忽略这些实现细节使得实现更加紧凑高效。
Web 服务的一个主要弱点就是 Web 服务不够稳定和健壮,因为如果服务提供者改变了面向服务编程中的架构设计,服务请求者不得不也作出相应的改变以升级服务的调用,否则,提供的服务将不会工作。对于地址请求 Web 服务应用程序来说,当服务提供者将服务从版本 1 升级到版本 2 时,你将不得不作出改变,如 表 1 所示:
表 1: 参数变动

标准化语义 Web 服务
Web 服务的调用可以标准化为如 清单 12 所示的格式:
清单 12: Web 服务标准化调用
Dim myService As New com.esri.arcwebservices ()
Dim request as String
Dim response As String
Dim description as String
description = myService.getServiceDescription()
request = getRequestXMLDoc()
response = myService.getService(request)
服务提供者需要提供两个基本接口 getService 和 getServiceDescription。 getServiceDescription 提供一个 XML 文档,它包含调用函数 getService 的 所有必要的信息和函数。通过服务请求和响应模板文档的 XML 模式,所有隐藏的信息必须在 getServiceDescription 中公开,例如关于输入输出变量是必须还是可选的等等。
对于示例中的地址请求 Web 服务,可通过请求 getServiceDescription 函数来获取 XML 文档,它包括语义请求和响应模板。模板如 清单 13 (sidefile) 所示。
清单 13 中的模板是自我描述的。为调用地址请求 Web 服务,请求者需要编辑一个 XML 文档,它包含模板中 <description> 描述的必要的元素,如:
·XML 声明
·服务请求
·指定名称的服务
·指定名称的函数
元素中描述的输入变量的集合 服务请求模板定义了哪个输入变量是可选的,数据源可使用哪个选项等等。
模板同样告诉服务请求者,为了利用函数调用 response = myService.getService(request)(详细信息参考 清单 13 )发送请求到 Web 服务,请求输入的字符串数据类型的可接收内容应该是一个指向服务请求模板的 XML 文档的 URL。这样请求者不得不将 XML 模板保存为 Web 服务器目录上的 XML 文档。URL 可以通过调用 request = getRequestXMLDoc() 来获得(详细信息请参考 清单 13 )。
在服务请求者发送请求来调用服务之前,基于服务提供者提供的模式,服务请求的 XML 模板可以通过函数 getRequestXMLDoc 来校验。 如果服务请求者不能够通过校验过程,服务请求者就会知道服务请求者升级了所提供的服务。在这种情况下,服务请求者只需要检查服务描述的 XML 文档模板来查看调用服务有哪些新的需求。
例如,ArcWeb 服务对于尚不具备数据源的服务增加了数据源参数。数据源在 表 2 列出的所有请求中都是必须的:
表 2: 包含数据源对象数据类型的 ArcWeb 服务

服务请求者需要在服务请求的 XML 模板中插入新的节点,而不是改变清单 7 和 10 中的代码片段。 尽管面向对象的技术可以仍旧在开发 Web 服务中继续使用,但语义请求和响应在服务提供和服务请求之间将优先考虑。语义调用将明确规范和简化 Web 服务的开发和利用,通过这种方式,服务请求者和服务提供者之间的协议内容将更加具体和明确。
由于 Web 服务通过语义请求和响应进行标准化,WSDL 和 UDDI 的角色需要重新认定,可以被 XML 模板描述的内容包括:
·内容
·输入输出变量的定义和意义
·函数性能
·怎样利用语义请求和响应来调用 Web 服务
这意味着所有 WSDL 文件可以拥有同样语法和内容,除了 Web 服务的名称和位置。在这种情况下,WSDL 将只是作为服务请求者区分和调用 Web 服务的接口而没有任何其它意义,因为所有的 Web 服务将拥有同样的 2 个功能接口:getServiceDescription:string 和 getService(request:string):string 。