我正在尝试使用Suds连接到SugarCRM soap服务(什么是正确的术语?):
from suds.client import Client
url = "http://localhost/sugarcrm/soap.php?wsdl"
client = Client(url)
session = client.service.login("usr", "pwd")
但是最后一行抛出异常:
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://www.sugarcrm.com/sugarcrm" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header/>
<ns2:Body>
<ns1:login>
<user_auth xsi:type="ns1:user_auth">usr</user_auth>
<application_name xsi:type="ns3:string">pwd</application_name>
</ns1:login>
</ns2:Body>
</SOAP-ENV:Envelope>
Traceback (most recent call last):
File "python.py", line 5, in <module>
session = client.service.login("usr", "pwd")
File "/usr/lib/pymodules/python2.6/suds/client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 602, in invoke
result = self.send(soapenv)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 653, in send
result = self.failed(binding, e)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 714, in failed
raise Exception((status, reason))
Exception: (404, u'Not Found')
答案 0 :(得分:4)
尝试将参数location=url
传递给Client
构造函数。有时,WSDL中的location元素与服务器上的URI不匹配。
client = Client(url, location=url)
答案 1 :(得分:1)
如果你不喜欢使用Suds,你应该尝试我们一直在努力通过Python连接到SugarCRM的Python库。它涉及REST与SOAP,它应该使访问速度更快。
上查看答案 2 :(得分:1)
使用SUDS连接存根时遇到了同样的问题。我总是得到Exception: (404, u'Not Found')
其他一切都设置得很好,所以我开始猜测和尝试。
我不知道某些SOAP服务器是否会导致这个或我需要手动设置位置的事实。解决方案是将服务名称附加到位置URL。因此,您需要为所使用的每个不同服务创建多个存根,但它可以工作:
servicename = "TestService"
client = Client(
url="foobar.wsdl",
location = "http://soap.example.com/foobar/" + servicename ,
)
result = client[servicename]["TestServicePort"].TestServiceFunction()
print(result)
这不是预期的行为,因为SUDS本身就应该这样(我认为),但它是唯一可以通过这个bug的选择。也许是因为我需要手动指定Client.location
属性,因此无论我需要调用什么服务,SUDS都不会改变它。
由于我花了一段时间才发现,我敢打赌这会帮助一些可怜的家伙:D
的问候, 迈克尔