2014-09-05 49 views
0

我试图访问与使用泡沫Python的webservice。这里是我的代码:Suds - 例外:(401,u'Unauthorized')

# WSDL fails to import schema, import this and create client. 
imp = Import('http://schemas.xmlsoap.org/soap/encoding/') 
imp.filter.add('http://api.daisycon.com/publisher/soap//program/') 
d = ImportDoctor(imp) 
encoded = base64.b64encode("%s:%s" % (username, password)) 
authenticationHeader = { 
    "SOAPAction" : "http://api.daisycon.com/publisher/soap//program/#getSubscriptions", 
    "Authorization" : "Basic %s" % encoded 
} 
client = suds.client.Client(self.url, headers = authenticationHeader, doctor=d) 

但是,调用方法时产生以下错误:

No handlers could be found for logger "suds.client" 
Traceback (most recent call last): 
    File "C:\Users\User\Documents\Crawler\src\Crawlers\Daisycon.py", line 39, in <module> 
    Crawler().main() 
    File "C:\Users\User\Documents\Crawler\src\Crawlers\Daisycon.py", line 37, in main 
    print client.service.getSubscriptions() 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 542, in __call__ 
    return client.invoke(args, kwargs) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 602, in invoke 
    result = self.send(soapenv) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 649, in send 
    result = self.failed(binding, e) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 708, in failed 
    raise Exception((status, reason)) 
Exception: (401, u'Unauthorized') 

我已经尝试添加各种方式,我可以在网上找到的凭据。什么都没有我100%确信证书是正确的。

另一种方式我想:

t = HttpAuthenticated(username=username, 
          password=password) 
client = suds.client.Client(self.url, transport=t, doctor=d) 

这就造成:

No handlers could be found for logger "suds.client" 
Traceback (most recent call last): 
    File "C:\Users\User\Documents\Crawler\src\Crawlers\Daisycon.py", line 35, in  <module> 
    Crawler().main() 
    File "C:\Users\User\Documents\Crawler\src\Crawlers\Daisycon.py", line 33, in main 
    print client.service.getFeeds() 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 542, in __call__ 
    return client.invoke(args, kwargs) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 602, in invoke 
result = self.send(soapenv) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 649, in send 
result = self.failed(binding, e) 
    File "C:\Python27\Lib\site-packages\suds\client.py", line 702, in failed 
r, p = binding.get_fault(reply) 
    File "C:\Python27\Lib\site-packages\suds\bindings\binding.py", line 265, in get_fault 
raise WebFault(p, faultroot) 
suds.WebFault: Server raised fault: 'Need authorisation' 

回答

0

可能的用户名/密码为的SOAPHeaders通过呢?如果是这样,你通过他们这样的:

from suds.sax.attribute import Attribute 
from suds.sax.element import Element 
... 
usr = Element('USER').setText('username') 
pwd = Element('PASSWORD').setText('password') 
header_list = [usr, pwd] 
reqsoap_attribute = Attribute('xsi:type', "xsd:string") 
for param in header_list: 
    param.append(reqsoap_attribute) 
client.set_options(soapheaders=header_list) 

这将增加肥皂:页眉部分的信封,如:

<soap:Header> 
    <USER xsi:type="xsd:string">username</USER> 
    <PASSWORD xsi:type="xsd:string">password</PASSWORD> 
</soap:Header> 
+0

引发同样的错误在第二个例子。 – SergioP 2014-09-08 06:57:54

+0

没有这样的运气(直接包含l/p到标题部分)?:headers = {'username':'username','password':'password'}然后传递给Client。你也可以试试这个:client.set_options(headers = {'username':'username','password':'password'}) – 2014-09-08 08:35:03

+0

也引发同样的错误 – SergioP 2014-09-08 10:59:35