有點上下文:我在解決認證問題後出現這個問題出現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()
恰到好處,感謝邁克爾!作爲例子,我會在問題中寫下我的解決方案。 – Pintun