开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜