带有 Zeep 的 Python SOAP 客户端 - 导入命名空间

标签 python soap wsdl xml-rpc zeep

一点背景:我正在打开这个问题 here , 在解决了身份验证问题之后。我更喜欢打开一个新的,以避免用与原始问题无关的评论污染以前的问题,并赋予它适当的可见性。

我正在开发一个 SOAP 客户端,该客户端与服务器在同一个 Intranet 中运行,但无法访问 Internet。

from requests.auth import HTTPBasicAuth
from zeep import Client
from zeep.transports import Transport

wsdl = 'http://mysite.dom/services/MyWebServices?WSDL'
client = Client(wsdl, transport=HTTPBasicAuth('user','pass'), cache=None)

问题:WSDL 包含对位于 Intranet 外部的外部资源的导入('import namespace="schemas.xmlsoap.org/soap/encoding/"'),因此 Zeep 客户端实例化失败:

Exception: HTTPConnectionPool(host='schemas.xmlsoap.org', port=80): Max retries exceeded with url: /soap/encoding/ (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f3dab9d30b8>: Failed to establish a new connection: [Errno 110] Connection timed out',))

问题:是否可以(并且有意义)在不访问外部资源的情况下创建 Zeep 客户端?

作为一个额外的细节,另一个用 Java 编写的基于 XML rpc ServiceFactory 的客户端似乎对这类问题更有弹性,即使没有可用的互联网连接,服务也会创建(并工作)。 真的需要从 xmlsoap.org 导入命名空间吗?

在@mvt 回答后编辑:

因此,我选择了建议的解决方案,它允许我同时控制对外部资源的访问(阅读:禁止访问不同于托管端点的服务器)。

class MyTransport(zeep.Transport):
    def load(self, url):
        if not url:
            raise ValueError("No url given to load")
        parsed_url = urlparse(url)
        if parsed_url.scheme in ('http', 'https'):
            if parsed_url.netloc == "myserver.ext":
                response = self.session.get(url, timeout=self.load_timeout)
                response.raise_for_status()
                return response.content
            elif url == "http://schemas.xmlsoap.org/soap/encoding/":
                url = "/some/path/myfile.xsd"
            else:
                raise
        elif parsed_url.scheme == 'file':
            if url.startswith('file://'):
                url = url[7:]
        with open(os.path.expanduser(url), 'rb') as fh:
            return fh.read()

最佳答案

您可以创建您自己的 tranport 类的子类,并向 load() 方法添加额外的逻辑,以便从文件系统重定向/加载特定的 url。

我认为代码非常简单:https://github.com/mvantellingen/python-zeep/blob/master/src/zeep/transports.py :-)

关于带有 Zeep 的 Python SOAP 客户端 - 导入命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40220134/

相关文章:

python - 在 python 中通过公共(public)列连接两个 csv 文件

python - 如何在eclipse中绘制matplotlib图?

python - 要求 python 导入是模块

php - NuSoap - 如何在 nusoap_client PHP 中使用本地现有的 WSDL 文件

java - 如何创建 wsdl 文件以在 Java 中使用 SOAP 服务器

wsdl - 从 XSD 文件生成 WSDL

python - 使用 pyqt 检索 postgres 中的一行中的所有记录

c# - 使用 C# 将签名的 SOAP 消息创建为字符串

java - 在 Eclipse : "wsdl:operation was not a request/response or one-way operation" 中验证期间出现奇怪的 WSDL 警告

c# - SOAP Web服务: many servers, 一个接口(interface)