为什么使用Suds时出现“异常:(404,u'未找到')”?

4 投票
3 回答
3312 浏览
提问于 2025-04-16 20:24

我正在尝试使用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')

3 个回答

1

如果你还没有开始使用Suds,那你可以试试我们正在开发的这个Python库,它可以帮助你通过Python连接到SugarCRM。这个库讲解了REST和SOAP的区别,这样访问会更快。

你可以在这里查看:https://github.com/sugarcrm/python_webservices_library

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

祝好,
迈克尔

5

试着在创建Client的时候,也传入一个参数location=url。有时候,WSDL中的位置元素和服务器上的URI不太一致。

client = Client(url, location=url)

撰写回答