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

问题描述:

有点上下文:我在解决认证问题后出现这个问题出现here。我更愿意打开一个新的,以避免污染前一个与原始问题无关的评论,并给予正确的可见性。Zeep的Python SOAP客户端 - 导入命名空间

我正在使用与服务器在同一个Intranet上运行的SOAP客户端,但无法访问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包含一个进口到位于内联网外部的外部资源(“进口命名空间=‘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客户端是否可能(并且有意义)?

作为一个额外的细节,基于XML rpc ServiceFactory的用Java编写的另一个客户端似乎对这种问题更具适应性,即使没有互联网连接可用,服务也会被创建(并运行)。 真的需要从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 :-)

+0

恰到好处,感谢迈克尔!作为例子,我会在问题中写下我的解决方案。 – Pintun