【发布时间】:2012-03-19 11:26:24
【问题描述】:
您好,我对 Python 和 Web 服务还很陌生,我已经开始尝试通过 Python 在 WSDL 中使用 Web 服务方法。现在,当我运行以下代码时,我得到的返回值是“”。我的目标是获取 GetMessage 方法的返回值(一个简单的 Hello World),而是获取该方法的此标识符。有没有办法得到这个返回值?
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
我也试过下面的代码
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
这将返回以下错误消息:
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')
我可以通过添加来绕过第一个没有处理程序的错误:
logging.getLogger('suds.client').setLevel(logging.CRITICAL)
但错误消息的其余部分将保留。有什么我错过的吗?我已经搜索了几个小时,但实际上找不到很多显示类似问题的东西。
更新:
这是第一个代码段中打印出来的内容:
<suds.client.Method instance at 0x02D9FC38>
我已经尝试过 sebastians 的想法,我得到的是以下内容:
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')
Sebastians idea 的客户价值如下:
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
更新 2:每个 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')
此错误的代码:
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
最终更新:
找到了问题的解决方法,事实证明问题与 python 代码无关,而与 Web 服务的 web.config 无关。需要用到basicHttpBinding
【问题讨论】:
-
您能否更新您的问题以显示
print client的输出? -
client.service.GetMessage()似乎是正确的。启用日志记录并显示导致400, u'Bad Request'错误的实际代码及其输出。 -
现在是 OP 中的日志和代码
-
代码和请求看起来不错(除了soapaction 可能不应该是unicode,但在这种情况下它不应该引起问题,你不需要
setrecursionlimit())。使用logging.getLogger('suds.client').setLevel(logging.DEBUG)查看来自服务器的 xml 回复。如果您想通知我,请在评论中添加@J.F. Sebastian。