Python-Suds.Client.Service problem, identifying printout instead of method text
Hi I am fairly new to Python and web services and I got started trying to use web services methods in WSDL via Python. Now, when I run the following code, I get the value "". I'm going to get the return value of the GetMessage method (simple Hello World), but instead get this ID for the method. Is there a way to get this return value?
import logging
import sys
from suds.client import Client
sys.setrecursionlimit(2000)
url='http://localhost:50774/HostDevServer/HelloWorldService.svc?wsdl'
client = Client(url)
example = client.service.GetMessage
print example
I have also tried the following code
import logging
import sys
from suds.client import Client
sys.setrecursionlimit(2000)
url='http://localhost:50774/HostDevServer/HelloWorldService.svc?wsdl'
client = Client(url)
example = client.service.GetMessage()
print example
and this returns the following error message:
No handlers could be found for logger "suds.client"
Traceback (most recent call last):
File "C:\Python27\exampleForSuds.py", line 7, in <module>
example = client.service.GetMessage()
File "build\bdist.win32\egg\suds\client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "build\bdist.win32\egg\suds\client.py", line 602, in invoke
result = self.send(soapenv)
File "build\bdist.win32\egg\suds\client.py", line 649, in send
result = self.failed(binding, e)
File "build\bdist.win32\egg\suds\client.py", line 708, in failed
raise Exception((status, reason))
Exception: (415, u'Unsupported Media Type')
I can work around the first error noted without handlers by adding:
logging.getLogger('suds.client').setLevel(logging.CRITICAL)
But the rest of the error message will remain. Am I missing something? I've searched for hours and can't find much that shows a similar problem.
UPDATE:
This is what is printed in the first segment of the code:
<suds.client.Method instance at 0x02D9FC38>
I tried sebastians idea and I get this:
Traceback (most recent call last):
File "C:\Python27\exampleForSuds.py", line 10, in <module>
example = client.service.GetMessage()
File "build\bdist.win32\egg\suds\client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "build\bdist.win32\egg\suds\client.py", line 602, in invoke
result = self.send(soapenv)
File "build\bdist.win32\egg\suds\client.py", line 649, in send
result = self.failed(binding, e)
File "build\bdist.win32\egg\suds\client.py", line 708, in failed
raise Exception((status, reason))
Exception: (400, u'Bad Request')
The meaning of the client for Sebastian's idea is as follows:
Suds ( https://fedorahosted.org/suds/ ) version: 0.4 GA build: R699-20100913
Service ( HelloWorldService ) tns="http://tempuri.org/"
Prefixes (1)
ns0 = "http://schemas.microsoft.com/2003/10/Serialization/"
Ports (1):
(WSHttpBinding_IHelloWorldService)
Methods (1):
GetMessage()
Types (3):
ns0:char
ns0:duration
ns0:guid
Update2: log request to Sebastians
DEBUG:suds.transport.http:sending:
URL:http://localhost:50774/HostDevServer/HelloWorldService.svc
HEADERS: {'SOAPAction': u'"http://tempuri.org/IHelloWorldService/GetMessage"', 'Content-Type': 'application/soap+xml; charset="UTF-8"', 'Content-type': 'application/soap+xml; charset="UTF-8"', 'Soapaction': u'"http://tempuri.org/IHelloWorldService/GetMessage"'}
MESSAGE:
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:ns0="http://tempuri.org/" xmlns:ns1="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:Header/><ns1:Body><ns0:GetMessage/></ns1:Body></SOAP-ENV:Envelope>
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://tempuri.org/" xmlns:ns1="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:Header/>
<ns1:Body>
<ns0:GetMessage/>
</ns1:Body>
</SOAP-ENV:Envelope>
Traceback (most recent call last):
File "C:\Python27\exampleForSuds.py", line 11, in <module>
example = client.service.GetMessage()
File "build\bdist.win32\egg\suds\client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "build\bdist.win32\egg\suds\client.py", line 602, in invoke
result = self.send(soapenv)
File "build\bdist.win32\egg\suds\client.py", line 649, in send
result = self.failed(binding, e)
File "build\bdist.win32\egg\suds\client.py", line 708, in failed
raise Exception((status, reason))
Exception: (400, u'Bad Request')
Code for this error:
import logging
import sys
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.transport.http').setLevel(logging.DEBUG)
from suds.client import Client
sys.setrecursionlimit(2000)
url='http://localhost:50774/HostDevServer/HelloWorldService.svc?wsdl'
headers = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}
client = Client(url,headers=headers)
print client
example = client.service.GetMessage()
print example
Final update:
Found a solution to the problem, it turned out that the problem has nothing to do with the python code, but the web.config for the web service. It should use basicHttpBinding
source to share
To fix the error 'Unsupported Media Type'
, you can specify the type supported by the server, for example:
headers = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}
client = Client(wsdl_url, headers=headers)
To see which foams are actually sent, you can set up logging:
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.transport.http').setLevel(logging.DEBUG)
source to share