清单 7: VB.NET 中 ESRI 的地址查询 Web 服务调用过程
Dim myAddress As New Address()
myAddress.houseNumber = "888"
myAddress.street = "Willey St"
myAddress.city = "Morgantown"
myAddress.state_prov = "WV"
myAddress.zone = "26505"
Dim myAddressFinderOptions As New AddressFinderOptions()
myAddressFinderOptions.dataSource = "GDT.Streets.US"
Dim myAuthentication As New Authentication()
Dim token as Stringtoken =
myAuthentication.getToken("[username]","[password]", 5)
Dim myAddressFinder As New com.esri.arcwebservices.AddressFinder ()
Dim myLocationInfo As New LocationInfo()
myLocationInfo =
myAddressFinder.findAddress(myAddress,myAddressFinderOptions,token)
在这一过程中,一些变量是基本的元素,是必须输入的,而其它一些却是可选的。 例如,除了门牌号和街道名称,Address 对象还有几个可选属性,如 Cross Street,它在上面的代码片段中并没有用到。所有其它属性都是调用过程必须的,但您如何知道黑盒中的这些详细信息呢?考虑到在不久的将来,将有大量的 Web 服务被开发和利用,对于应用程序开发者来说,即使提供对象模型、流程图和描述信息,深入分析和了解这些由不同服务提供者产生的 Web 服务调用规程也将非常困难。
Web 服务的语义调用主要关注服务请求和响应的标准化,以此来简化编程步骤,使得 Web 服务调用机制可读,容易理解。 整个过程如 清单 8 所示,可以与 清单 7 调用地址查询 Web 服务的代码片段进行对比。
清单 8: 通过语义请求 ESRI 的地址查询 Web 服务调用过程
Dim myService As New com.esri.arc Web services ()
Dim request as String
Dim response As String
request = getRequestXMLDoc()
response = myService.getService(request)
这里,请求和响应都是 XML 文档,它们描述了服务调用规程的细节和步骤,其中包括输入变量和输出结果的要求。首先,服务请求者需要编辑如 清单 9 所示的 XML 文档, 然后产生一个 getRequestXMLDoc 函数,以字符串或指向文档的 URL 的形式来读取这个 XML 文档,它取决于服务提供者的定义。
一般来说,服务名字就是函数调用的对象名,如 AddressFinder, 它有一个 findAddress函数。然而,语义请求和响应通过在 XML 文档中标准化整个编码流程而公开了开发规程。 在这种情况下,各种各样的 Web 服务可以共享同一个功能接口,如 getService(request)。
在地址查询 Web 服务示例中,它的服务调用可以以 清单 9 所示的 XML 文档作为输入请求。通过这种方式,面向对象编程中隐藏的信息可以公开给服务请求者。
清单 9: 调用 ESRI 的地址查询 Web 服务的语义请求
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<ServiceRequest>
<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>
</Function>
</Service>
</ServiceRequest>
通过语义请求和响应隐藏实现细节
地址查询 Web 服务的输出是一个 LocationInfo 对象,它包含如下信息,如 Number of Candidates、 Match Type 等等以及一个 Location 对象类型的数组,就像前面提到的。为获取位置信息(经度和纬度),Visual Basic .NET 中必须使用如 清单 10 所示突出显示的代码片段。
清单 10: 在 VB.NET 中通过地址查询 Web 服务获取位置信息
Dim myAddress As New Address()
myAddress.houseNumber = "888"
myAddress.street = "Willey St"
myAddress.city = "Morgantown"
myAddress.state_prov = "WV"
myAddress.zone = "26505"
Dim myAddressFinderOptions As New AddressFinderOptions()
myAddressFinderOptions.dataSource = "GDT.Streets.US"
Dim myAuthentication As New Authentication()
Dim token as Stringtoken = myAuthentication.getToken("[username]","[password]", 5)
Dim myAddressFinder As New com.esri.arcwebservices.AddressFinder ()
Dim myLocationInfo As New LocationInfo()
myLocationInfo = myAddressFinder.findAddress(myAddress,myAddressFinderOptions,token)
Dim loc As New com.esri.arcwebservices.Location()
loc = locInfo.candidates(0) 'just retrieve the first record
Dim strLocation As String
strLocation = loc.description1 + " is located at: " +
" Longitude: " + loc.point.x + ", Latitude: " + loc.point.y
同样,隐藏信息通过如 清单 11 所示的语义响应而清楚地公开出来。例如 WSDL 文件中 <description1> 元素的意义可以通过从服务请求者获取的语义响应中的 <LocationDescription> 元素来清楚地说明。