12.4. SOAP 网络服务查错
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 12.4. SOAP 网络服务查错

SOAP 提供了一个很方便的方法用以查看背后的情形。

`SOAPProxy` 的两个小设置就可以打开查错模式。

### 例 12.7. SOAP 网络服务查错

    >>> from SOAPpy import SOAPProxy
    >>> url = 'http://services.xmethods.net:80/soap/servlet/rpcrouter'
    >>> n = 'urn:xmethods-Temperature'
    >>> server = SOAPProxy(url, namespace=n)
    >>> server.config.dumpSOAPOut = 1
    >>> server.config.dumpSOAPIn = 1
    >>> temperature = server.getTemp('27502')
    *** 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">27502</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">80.0</return>
    </ns1:getTempResponse>

    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    ************************************************************************

    >>> temperature
    80.0

| 首先，和平常一样，建立带有服务 URL 和命名空间的 `SOAPProxy`。
| 然后，通过设置 `server.config.dumpSOAPIn` 和 `server.config.dumpSOAPOut` 打开查错模式。
| 最后，和平常一样，调用远程 SOAP 方法。SOAP 库将会输出送出的 XML 请求文档和收到的 XML 返回文档。这是 `SOAPProxy` 为你做的所有工作。有点恐怖，不是吗？让我们来分析一下。

大部分 XML 请求文档都基于模板文件。忽略所有命名空间声明这些对于所有 SOAP 调用都一成不变的东西。这个 “函数调用” 的核心是`<Body>` 当中的部分：

    <ns1:getTemp
      xmlns:ns1="urn:xmethods-Temperature"
      SOAP-ENC:root="1">
    <v1 xsi:type="xsd:string">27502</v1>
    </ns1:getTemp>

| 这个元素名 `getTemp` 就是函数名。`SOAPProxy` 使用 `getattr` 作为分发器。有别于使用方法名分别调用本地方法，这里使用方法名构造了一个 XML 请求文档。
| 函数的 XML 元素被存储于一个特别的命名空间，这个命名空间就是你在建立 `SOAPProxy` 对象时所指定的那个命名空间。也不必为 `SOAP-ENC:root` 而苦恼，因为它也是基于模板文件的。
| 函数的参数也被记入 XML 文档。`SOAPProxy` 查看并确定每个参数的数据类型 (这里是 string 字符串类型)。参数的数据类型记入 `xsi:type` 属性，并在其后记入实际的字符串值。

返回的 XML 文档同样容易理解，重点在于知道应该忽略掉哪些内容。把注意力集中在 `<Body>` 部分：

    <ns1:getTempResponse
      xmlns:ns1="urn:xmethods-Temperature"
      SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <return xsi:type="xsd:float">80.0</return>
    </ns1:getTempResponse>

| 服务器传回的值记录在 `<getTempResponse>` 部分的几行中。通常包括函数名和回应 `(Response)`。当然其他的内容也可能出现在这里，但 `SOAPProxy` 所重视的不是这里的元素名，而是命名空间。
| 服务器返回时所使用的命名空间就是在请求时所用的命名空间，也就是在创建 `SOAPProxy` 对象时所指定的命名空间。本章稍后的部分中，我们将看到在创建 `SOAPProxy` 对象时忘记指定功能名空间会怎样。
| 这是返回值和它的数据类型 (浮点类型 float)。`SOAPProxy` 使用显式数据类型创建一个本地数据类型的 Python 对象并返回之。