<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    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 文檔甩下來。

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频