<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            12.6. 以 WSDL 進行 SOAP 內省

            就像網絡服務舞臺上的所有事物,WSDL 也經歷了一個充滿明爭暗斗而且漫長多變的歷史。我不打算講述這段令我傷心的歷史。還有一些其他的標準提供相同的支持,但 WSDL 還是勝出,所以我們還是來學習一下如何使用它。

            WSDL 最基本的功能便是讓你揭示 SOAP 服務器所提供的有效方法。

            例 12.8. 揭示有效方法

            >>> from SOAPpy import WSDL          1
            >>> wsdlFile = 'http://www.xmethods.net/sd/2001/TemperatureService.wsdl'
            >>> server = WSDL.Proxy(wsdlFile)    2
            >>> server.methods.keys()            3
            [u'getTemp']
            
            1 SOAPpy 包含一個 WSDL 解析器。在本書寫作之時,它被標示為開發的初級階段,但我從來沒有在解析任何 WSDL 文件時遇到問題。
            2 使用一個 WSDL 文件,你還是要用到一個 proxy 類:WSDL.Proxy,它只需一個參數:WSDL 文件。我指定的是存儲在遠程服務器上的 WSDLURL,但是這個 proxy 類對于本地的 WSDL 副本工作同樣出色。創建 WSDL proxy 將會下載 WSDL 文件并解析它,所以如果 WSDL 文件有任何問題 (或者由于網絡問題不能獲得) 你會立刻知道。
            3 WSDL proxy 類通過 Python 字典 server.methods 揭示有效函數。所以列出有效方法只需調用字典方法 keys()

            好的,你知道這個 SOAP 服務器提供一個方法:getTemp。但是如何去調用它呢?WSDL 也在這方面提供信息。

            例 12.9. 揭示一個方法的參數

            >>> callInfo = server.methods['getTemp']  1
            >>> callInfo.inparams                     2
            [<SOAPpy.wstools.WSDLTools.ParameterInfo instance at 0x00CF3AD0>]
            >>> callInfo.inparams[0].name             3
            u'zipcode'
            >>> callInfo.inparams[0].type             4
            (u'http://www.w3.org/2001/XMLSchema', u'string')
            
            1 server.methods 字典中記錄一個 SOAPpy 的特別結構,被稱為 CallInfoCallInfo 對象中包含著特定函數和函數參數的信息。
            2 函數參數信息存儲在 callInfo.inparams 中,這是一個記錄每一個參數信息的 ParameterInfo 對象的 Python 列表。
            3 每個 ParameterInfo 對象包含一個 name 屬性,這便是參數名。在通過 SOAP 調用函數時,你不需要知道參數名,但 SOAP 支持在調用函數時使用參數名 (類似于 Python)。如果使用參數名,WSDL.Proxy 將會正確地把這些參數關聯到遠程函數。
            4 每個參數都是都是顯式類型的,使用的是在 XML Schema 定義的數據類型。你可以在上一節中發現這一點:XML Schema 命名空間是我讓你忽略的模版的一部分。就目前而言,你還是可以繼續忽略它。zipcode 參數是一個字符串,如果你向 WSDL.Proxy 對象傳遞一個 Python 字符串,它會被正確地關聯和傳遞到服務器。

            WSDL 還允許你自省函數的返回值。

            例 12.10. 揭示方法返回值

            >>> callInfo.outparams            1
            [<SOAPpy.wstools.WSDLTools.ParameterInfo instance at 0x00CF3AF8>]
            >>> callInfo.outparams[0].name    2
            u'return'
            >>> callInfo.outparams[0].type
            (u'http://www.w3.org/2001/XMLSchema', u'float')
            
            1 與揭示函數參數的 callInfo.inparams 對應的是揭示返回值的 callInfo.outparams。它也同樣是一個列表,因為通過 SOAP 調用函數時可以返回多個值,就像 Python 函數一樣。
            2 ParameterInfo 對象包含 nametype。這個函數返回一個浮點值,它的名字是 return

            讓我們整合一下,通過 WSDL proxy 調用一個 SOAP 網絡服務。

            例 12.11. 通過 WSDL proxy 調用一個 SOAP 網絡服務

            >>> from SOAPpy import WSDL
            >>> wsdlFile = 'http://www.xmethods.net/sd/2001/TemperatureService.wsdl')
            >>> server = WSDL.Proxy(wsdlFile)               1
            >>> server.getTemp('90210')                     2
            66.0
            >>> server.soapproxy.config.dumpSOAPOut = 1     3
            >>> server.soapproxy.config.dumpSOAPIn = 1
            >>> temperature = server.getTemp('90210')
            *** Outgoing SOAP ******************************************************
            <?xml version="1.0" encoding="UTF-8"?>
            <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
              xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsd="http://www.w3.org/1999/XMLSchema">
            <SOAP-ENV:Body>
            <ns1:getTemp xmlns:ns1="urn:xmethods-Temperature" SOAP-ENC:root="1">
            <v1 xsi:type="xsd:string">90210</v1>
            </ns1:getTemp>
            </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
            ************************************************************************
            *** Incoming SOAP ******************************************************
            <?xml version='1.0' encoding='UTF-8'?>
            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <SOAP-ENV:Body>
            <ns1:getTempResponse xmlns:ns1="urn:xmethods-Temperature"
              SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <return xsi:type="xsd:float">66.0</return>
            </ns1:getTempResponse>
            
            </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
            ************************************************************************
            
            >>> temperature
            66.0
            
            1 這比直接調用 SOAP 服務時的設置簡單,因為在 WSDL 文件中包含著調用服務所需要的服務 URL 和命名空間。創建 WSDL.Proxy 對象將會下載 WSDL 文件,解析之,并設置一個用以調用實際的 SOAP 網絡服務的 SOAPProxy 對象。
            2 只要創建了 WSDL.Proxy 對象,你就可以像調用 SOAPProxy 對象一樣簡單地調用一個函數。這并不奇怪,WSDL.Proxy 就是一個具有自省方法的 SOAPProxy 封裝套件,所以調用函數的語法也是一樣的。
            3 你可以通過 server.soapproxy 訪問 WSDL.ProxySOAPProxy。這對于打開查錯模式很重要,這樣一來當你通過 WSDL proxy 調用函數時,它的 SOAPProxy 將會把線路上來往的 XML 文檔甩下來。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线