信息化 频道

标准 Web 服务的语义请求和响应

    清单 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> 元素来清楚地说明。

0
相关文章