2016-10-24 64 views
1

有點上下文:我在解決認證問題後出現這個問題出現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() 

回答

相關問題