2016-10-24 4 views
1

약간의 컨텍스트 : 인증 문제를 해결 한 후이 질문을 열었습니다. here. 원래 문제와 관련이없는 주석으로 이전을 오염시키지 않고 적절한 가시성을주기 위해 새 것을 열 것을 선호합니다.Zeep이있는 Python SOAP 클라이언트 - 가져 오기 네임 스페이스

저는 인터넷 액세스없이 서버와 동일한 인트라넷에서 실행되는 SOAP 클라이언트에서 작업하고 있습니다.

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',)) 

질문 : 외부 리소스에 액세스하지 않고 지프 클라이언트를 만들 수 있습니까?

추가 세부 사항으로 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() 

답변