返回介绍

12.4. SOAP 网络服务查错

发布于 2019-09-14 13:30:46 字数 6378 浏览 808 评论 0 收藏 0

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)     1
>>> server.config.dumpSOAPOut = 1            2
>>> server.config.dumpSOAPIn = 1
>>> temperature = server.getTemp('27502')    3
*** 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
1首先,正常建立带有服务 URL 和命名空间的 SOAPProxy。
2然后,通过设置 server.config.dumpSOAPIn 和 server.config.dumpSOAPOut 打开查错模式。
3最后,正常调用远程 SOAP 方法。SOAP 库将会输出送出的 XML 请求文档和收到的 XML 返回文档。这是 SOAPProxy 为你做的所有工作。 有点恐怖,不是吗?让我们来分析一下。

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

<ns1:getTemp                                 1
  xmlns:ns1="urn:xmethods-Temperature"       2
  SOAP-ENC:root="1">
<v1 xsi:type="xsd:string">27502</v1>         3
</ns1:getTemp>
1这个元素名 getTemp 就是函数名。SOAPProxy 把 getattr 当作一个发报机。有别使用方法名分别调用本地方法,这里使用方法名构造了一个 XML 请求文档。
2函数的 XML 元素被存储于一个特别的命名空间,这个命名空间就是你在建立 SOAPProxy 对象时所指定的那个命名空间。也不必为 SOAP-ENC:root 而苦恼,因为它也是基于模板文件的。
3函数的参数也被记入 XML 文档。 SOAPProxy 查看并确定每个参数的数据类型(这里是 string 字符串类型)。参数的数据类型记入 xsi:type 属性,并在其后记入实际的字符串值。

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

<ns1:getTempResponse                             1
  xmlns:ns1="urn:xmethods-Temperature"           2
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:float">80.0</return>       3
</ns1:getTempResponse>
1服务器传回的值记录在 <getTempResponse> 部分的几行中。 通常包括函数名和回应 (Response)。当然其他的内容也可能出现在这里,但 SOAPProxy 所重视的不是这里的元素名,而是命名空间。
2服务器返回时所使用的命名空间就是在请求时所用的命名空间,也就是在创建 SOAPProxy 对象时所指定的命名空间。本章稍后的部分中,我们将看到在创建 SOAPProxy 对象时忘记指定功能名空间会怎样。
3这是返回值和它的数据类型(浮点类型 float)。 SOAPProxy 使用显性数据类型创建一个原始数据类型的 Python 对象并返回之。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文