4

我正在尝试使用 Suds 连接到 SugarCRM 肥皂服务(正确的术语是什么?):

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

3 回答 3

5

尝试将参数也传递location=urlClient构造函数。有时 WSDL 中的 location 元素与服务器上的 URI 不匹配。

client = Client(url, location=url)
于 2011-06-27T23:39:50.807 回答
2

我在使用 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 本身应该这样做(我认为),但它是克服这个错误的唯一选择。可能是因为我需要Client.location手动指定属性,因此无论我需要调用什么服务,SUDS 都不再更改它。

由于我花了一段时间才发现,我敢打赌这对一些可怜的人有帮助:D

问候,迈克尔

于 2013-08-06T12:36:16.203 回答
1

如果您不喜欢使用 Suds,您应该尝试使用我们一直致力于通过 Python 连接到 SugarCRM 的 Python 库。它超越了 REST 与 SOAP,后者应该使访问速度更快。

在https://github.com/sugarcrm/python_webservices_library查看

于 2011-06-28T01:14:19.240 回答