Why am I getting "Exception: (404, u'Not Found')" with Suds
I am trying to connect to SugarCRM soap services (what's the correct terminology?) using Suds:
from suds.client import Client
url = "http://localhost/sugarcrm/soap.php?wsdl"
client = Client(url)
session = client.service.login("usr", "pwd")
But the very last line throws an exception:
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.or开发者_如何学编程g/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')
Try passing also the argument location=url
to the Client
constructor. Sometimes the location element in WSDLs doesn't match up with URI on the server.
client = Client(url, location=url)
I was having the same issue when using a SUDS connection stub. I was always getting Exception: (404, u'Not Found')
Everything else was set up fine so i just started guessing and trying.
I don't know if certain SOAP servers cause this or the fact that i need to set location by hand. The solution was to append the name of the service to the location URL. So you need to create several stubs for each distinct service used but it works:
servicename = "TestService"
client = Client(
url="foobar.wsdl",
location = "http://soap.example.com/foobar/" + servicename ,
)
result = client[servicename]["TestServicePort"].TestServiceFunction()
print(result)
This is not intended behavior, because the SUDS should to this by itself (i think), but it was the only option to get past this bug. Maybe its caused by the fact i needed to specify the Client.location
attribute by hand, and so SUDS does not change it anymore regardless of what service i need to call.
Since it took me a while to find out, I bet this helps some poor guy :D
regards, Michael
If you aren't hooked on using Suds, you should try the Python library we've been working on for connecting to SugarCRM via Python. It goes over REST versus SOAP, which should make access much faster.
Check it out at https://github.com/sugarcrm/python_webservices_library
精彩评论