12.4. SOAP 网络服务查错
优质
小牛编辑
121浏览
2023-12-01
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 对象并返回之。 |