2015-10-07 2 views
0

Я пытаюсь сделать простой вызов SOAP с WSDL и аутентификацией, но не знаю, как передать учетные данные для вызова. Возможно ли это с WSDL, или я должен сделать это по-другому?Идентификация клиента SOAPpy WSDL

from SOAPpy import WSDL 

WSDLFILE = 'link/to/wsdl/file' 
server = WSDL.Proxy(WSDLFILE) 

result = server.methodCall() 

Прямо сейчас, я получаю эту ошибку:

File "/usr/lib/pymodules/python2.7/SOAPpy/Client.py", line 263, in call 
raise HTTPError(code, msg) 
SOAPpy.Errors.HTTPError: <HTTPError 401 Unauthorized> 
+1

SOAPpy устарел в пользу [suds] (https://fedorahosted.org/suds/) - Я использовал пены с успехом, проверьте их примеры. – Monkpit

+0

@Monkey Спасибо, есть невероятная разница между этими двумя - suds намного проще. – erhesto

+0

@Monkpit и @orhesto - кажется, что заброшено, SOAPpy тоже, хотя намного больше «свежего», чем пенообразование ... – Greg0ry

ответ

1

довольно старый вопрос, но так как он показывает первый, когда прибегая к помощи «аутентификация SOAPpy» - я оставлю свои выводы так, может быть, вы выиграли 't должен ударить головой в течение 10 часов. Возвращение к сообществу.

Googling не сильно поможет, но этот пример здесь (http://code.activestate.com/recipes/444758-how-to-add-cookiesheaders-to-soappy-calls/) заставил меня написать свой собственный помощник (версия 0.0 бета)

from SOAPpy import (
    WSDL, 
    HTTPTransport, 
    Config, 
    SOAPAddress, 
) 
import urllib2 
import base64 

class AuthenticatedTransport(HTTPTransport): 
    _username = None 
    _password = None 

    def call(self, addr, data, namespace, soapaction = None, encoding = None, http_proxy = None, config = Config, timeout = 10): 
     if not isinstance(addr, SOAPAddress): 
      addr = SOAPAddress(addr, config) 

     t = 'text/xml'; 
     if encoding != None: 
      t += '; charset="%s"' % encoding 

     encoded_auth = None 
     if (isinstance(AuthenticatedTransport._username, str) != False): 
      if (isinstance(AuthenticatedTransport._password, str) == False): 
       AuthenticatedTransport._password = "" 
      encoded_auth = base64.b64encode('%s:%s' % (self._username, self._password)) 

     this_request = None 
     if (encoded_auth is not None): 
      this_request = urllib2.Request(
       url=address.proto + "://" + address.host + address.path, 
       data=data, 
       headers={ 
        "Content-Type":content_type, 
        "SOAPAction":"%s" % soapaction, 
        "Authorization":"Basic %s" % encoded_auth 
       } 
      ) 
     else: 
      this_request = urllib2.Request(
       url=address.proto + "://" + address.host + address.path, 
       data=data, 
       headers={ 
        "Content-Type":content_type, 
        "SOAPAction":"%s" % soapaction, 
       } 
      ) 

     response = urllib2.urlopen(this_request) 
     data = response.read() 

     # get the new namespace 
     if namespace is None: 
      new_ns = None 
     else: 
      new_ns = self.getNS(namespace, data) 

     # return response payload 
     return data, new_ns 

WSDL.Config.strictNamespaces = 0 

username = "your_username" 
password = "your_password" 

WSDLFile = "https://%s:%[email protected]_host/your_wsdl.php?wsdl" % (username, password) 
namespace = "http://futureware.biz/mantisconnect" 
proxy = WSDL.Proxy(WSDLFile, namespace=namespace, transport = AuthenticatedTransport(username,password)) 

print(proxy.mc_get_version()) # This is my WSDL call, your will be different 

По какой-то причине он не достаточно, чтобы использовать класс AuthenticatedTransport, в WSDL url сам также должен содержать имя пользователя и пароль. Возможно, это потому, что SOAP-оболочка, вызываемая WSDL здесь, создает отдельный сеанс HTTP (помните, что читайте об этом в списке рассылки SOAPpy).

Надеюсь, это поможет кому-то.

Смежные вопросы