我有一个关于WCF和SUDS(Python)之间表示继承的不同方式的问题.我有一个C++/CLI WCF服务器(.NET 3.5 SP1),我正在尝试与它通信.我已经使用了C#(WCF也是)客户端,它工作正常,但使用SUDS客户端时存在问题(Python 2.6.4,SUDS 0.3.8).它基本上很好,但对于继承类型,差别似乎在于两者代表SOAP XML中的继承.当我查看服务器记录的消息时,我得到的结果类似于以下内容:
C#客户端:
<ns:DerivedType>
...
</ns:DerivedType>
Run Code Online (Sandbox Code Playgroud)
Python客户端:
<ns:BaseType xsi:type="ns:DerivedType">
...
</ns:BaseType>
Run Code Online (Sandbox Code Playgroud)
是否可以更改WCF服务器以接受Python样式?或者更改Python SUDS客户端以发送WCF样式?哪一个是正确的?
好吧我正在努力改进python,所以我不确定这是开始我正在做什么的正确方法,但这是我目前的问题......
我需要通过SOAP方法获取一些信息,现在只使用部分信息,但存储整个结果以备将来使用(我们需要尽可能少地使用该服务).查找访问服务的最佳方式我认为suds是要走的路,它很简单,就像一个魅力来获取数据.但是现在我想以某种方式保存结果,最好是序列化/在数据库中,这样我以后可以把它拉出来并使用它.
什么是最好的方法,看起来像pickle/json不是一个选项?谢谢!
更新 阅读最佳答案我怎样才能腌泡沫效果?让我更好地了解为什么这不是一个选项,我想我已经卡住了重建一个基本的对象w /我需要的信息?
我一直试图通过使用SUDS的wsdl文件来控制相机.我有代码工作,但我想将错误处理放入脚本.我尝试过不同的异常但无法使脚本正常工作.当我输入无效坐标时,我收到错误.我正在使用的代码如下,接着是我收到的错误.
#!/home/build/Python-2.6.4/python
import suds
from suds.client import Client
####################################################################
#
# Python SUDS Script that controls movement of Camera
#
####################################################################
#
# Absolute Move Function
#
####################################################################
def absoluteMove():
# connects to WSDL file and stores location in variable 'client'
client = Client('http://file.wsdl')
# Create 'token' object to pass as an argument using the 'factory' namespace
token = client.factory.create('ns4:ReferenceToken')
print token
# Create 'dest' object to pass as an argument and values passed to this object
dest = client.factory.create('ns4:PTZVector') …Run Code Online (Sandbox Code Playgroud) 所以我试图使用SUDS 访问这个api https://www.clarityaccounting.com/api-docs/.这是应该工作的代码:
from suds.client import Client
client = Client('https://www.clarityaccounting.com/api/v1?wsdl')
token = client.service.doLogin('demo', 'demo', 'www.kashoo.com', 'en_US', 300000)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
WebFault: Server raised fault: 'No such operation: (HTTP GET PATH_INFO: /api/v1)'
Run Code Online (Sandbox Code Playgroud)
他们的支持人员说请求应该如下所示:
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:api="http://api.service.books/">
<SOAP-ENV:Body>
<api:doLogin>
<username>demo</username>
<password>demo</password>
<siteName>www.kashoo.com</siteName>
<locale>en_US</locale>
<duration>300000</duration>
</api:doLogin>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是SUDS'看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:ns0="http://api.service.books/"
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:doLogin>
<username>demo</username>
<password>demo</password>
<siteName>www.kashoo.com</siteName>
<locale>en_US</locale>
<duration>300000</duration>
</ns0:doLogin>
</ns1:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
我是一个真正的SOAP和SUDS新手,但我听说SUDS是从这里使用的最好的SOAP库:Python存在哪些SOAP客户端库,它们的文档在哪里?
所以我的问题是什么是不同的关键部分,使请求失败,如何配置SUDS发送格式正确的请求?
我的网络上有一个摄像头,我试图用肥皂水连接,但泡沫不会发送所需的所有信息.我需要在WSDL文件中放置未定义的额外soap标头,以便摄像头可以理解该消息.所有头文件都包含在SOAP信封中,然后suds命令应该在邮件正文中.
我已经检查了suds 网站 ,它说要像这样传入标题:(这会将元素作为标题传递,但我有一个信封,所以我不知道如何输入这个)
from suds.sax.element import Element
client = client(url)
ssnns = ('ssn', 'http://namespaces/sessionid')
ssn = Element('SessionID', ns=ssnns).setText('123')
client.set_options(soapheaders=ssn)
result = client.service.addPerson(person)
Run Code Online (Sandbox Code Playgroud)
现在,我不确定如何实现这一点.比方说,我有以下标题:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP
ENC="http://www.w3.org/2003/05/soap-encoding"
<wsa:MessageID SOAP-ENV:mustUnderstand="true">urn:uuid:43268c01-f09c6</wsa:MessageID>
<SOAP-ENV:Header>
Run Code Online (Sandbox Code Playgroud)
使用这个或类似的例子有谁知道如何将有效的SOAP消息传递给目标服务?
谢谢
我有一个基于Twisted的项目,用于与网络设备通信,我正在添加对API为SOAP 的新供应商(Citrix NetScaler)的支持.不幸的是,Twisted中对SOAP的支持依然存在SOAPpy,这已经过时了.事实上,就这个问题(我刚检查过)而言,twisted.web.soap
本身在21个月内甚至没有更新!
我想问一下,如果有人有任何经验,他们愿意与SUDS使用Twisted的超级异步传输功能.看起来插入一个自定义的Twisted传输将是一个自然的SUDS' Client.options.transport,我只是很难缠绕我的头.
我确实想出了一种方法,通过利用异步方式使用SUDS调用SOAP方法twisted.internet.threads.deferToThread(),但这对我来说就像是一个黑客.
这是我做过的一个例子,给你一个想法:
# netscaler is a module I wrote using suds to interface with NetScaler SOAP
# Source: http://bitbucket.org/jathanism/netscaler-api/src
import netscaler
import os
import sys
from twisted.internet import reactor, defer, threads
# netscaler.API is the class that sets up the suds.client.Client object
host = 'netscaler.local'
username = password = 'nsroot'
wsdl_url = 'file://' + os.path.join(os.getcwd(), 'NSUserAdmin.wsdl')
api = netscaler.API(host, username=username, password=password, wsdl_url=wsdl_url)
results = []
errors …Run Code Online (Sandbox Code Playgroud) [主要编辑基于两天前第一篇文章以来的经验.]
我正在使用Suds构建Python SOAP/XML脚本,但我很难获得生成服务器可接受的SOAP/XML的代码.我曾经认为问题是Suds没有为内部元素生成前缀,但后来发现缺少前缀(参见Sh-Data和内部元素)不是问题,因为Sh-Data和MetaSwitchData元素声明了适当的命名空间(见下文).
<SOAP-ENV:Envelope xmlns:ns3="http://www.metaswitch.com/ems/soap/sh" xmlns:ns0="http://www.metaswitch.com/ems/soap/sh/userdata" xmlns:ns1="http://www.metaswitch.com/ems/soap/sh/servicedata" 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:Header/>
<ns2:Body>
<ns3:ShUpdate>
<ns3:UserIdentity>Meribel/TD Test Sub Gateway 3</ns3:UserIdentity>
<ns3:DataReference>0</ns3:DataReference>
<ns3:UserData>
<Sh-Data xmlns="http://www.metaswitch.com/ems/soap/sh/userdata">
<RepositoryData>
<ServiceIndication>Meta_SubG_BaseInformation</ServiceIndication>
<SequenceNumber>0</SequenceNumber>
<ServiceData>
<MetaSwitchData xmlns="http://www.metaswitch.com/ems/soap/sh/servicedata" IgnoreSequenceNumber="False" MetaSwitchVersion="?">
<Meta_SubG_BaseInformation Action="apply">
<NetworkElementName>Meribel</NetworkElementName>
<Description>TD Test Sub Gateway 3</Description>
<DomainName>test.datcon.co.uk</DomainName>
<MediaGatewayModel>Cisco ATA</MediaGatewayModel>
<CallFeatureServerControlStatus/>
<CallAgentControlStatus/>
<UseStaticNATMapping/>
<AuthenticationRequired/>
<ProviderStatus/>
<DeactivationMode/>
</Meta_SubG_BaseInformation>
</MetaSwitchData>
</ServiceData>
</RepositoryData>
</Sh-Data>
</ns3:UserData>
<ns3:OriginHost>user@domain.com?clientVersion=7.3</ns3:OriginHost>
</ns3:ShUpdate>
</ns2:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
但这仍然失败.问题是Suds为可选元素生成空元素(Mandatory = No在WSDL中标记).但是服务器要求可选元素存在具有合理值或不存在,并且我得到以下错误(因为该<CallFeatureServerControlStatus/>元素不是允许值之一.
提供的用户数据未针对用户数据针对MetaSwitch XML架构进行验证.
详细信息:cvc-enumeration-valid:对于枚举'[Controlling,Abandoned,Cautiously controlling]',值''不是facet-valid.它必须是枚举中的值.
如果我将生成的SOAP/XML带入SOAPUI并删除空元素,那么请求就可以了.
有没有办法让Suds不为可选字段生成空元素,或者让我之后在代码中删除它们?
主要更新
我已经解决了这个问题(我在其他地方已经看过)但是以一种非常不优雅的方式.所以我发布我当前的解决方案,希望a)它可以帮助他人和/或b)有人可以建议更好的解决方案.
事实证明,问题不在于Suds为可选元素生成空元素(Mandatory …
这个问题与: Python SOAP服务器/客户端有关
在使用python的soap的情况下,建议使用soaplib(http://wiki.github.com/jkp/soaplib)作为soap服务器和suds (https://fedorahosted.org/suds/)作为soap客户端.我的目标是在python中创建可由多个客户端(java等)使用的soap服务.我尝试了soaplib的HelloWorld示例(http://trac.optio.webfactional.com/wiki/HelloWorld).当客户端也使用soaplib时,它运行良好.
然后,我尝试使用suds作为消费HelloWorld服务的客户端,它失败了. - 为什么会这样?soaplib服务器是否有不同客户端使用的问题?
这里是服务器的代码:
from soaplib.wsgi_soap import SimpleWSGISoapApp
from soaplib.service import soapmethod
from soaplib.serializers.primitive import String, Integer, Arraycode
class HelloWorldService(SimpleWSGISoapApp):
@soapmethod(String,Integer,_returns=Array(String))
def say_hello(self,name,times):
results = []
for i in range(0,times):
results.append('Hello, %s'%name)
return results
if __name__=='__main__':
from cherrypy.wsgiserver import CherryPyWSGIServer
#from cherrypy._cpwsgiserver import CherryPyWSGIServer
# this example uses CherryPy2.2, use cherrypy.wsgiserver.CherryPyWSGIServer for CherryPy 3.0
server = CherryPyWSGIServer(('localhost',7789),HelloWorldService())
server.start()
Run Code Online (Sandbox Code Playgroud)
这是soaplib客户端:
from soaplib.client import make_service_client
from SoapServerTest_1 import HelloWorldService
client = …Run Code Online (Sandbox Code Playgroud) 我有以下简单的python测试脚本,它使用Suds来调用SOAP Web服务(该服务是用ASP.net编写的):
from suds.client import Client
url = 'http://someURL.asmx?WSDL'
client = Client( url )
result = client.service.GetPackageDetails( "MyPackage" )
print result
Run Code Online (Sandbox Code Playgroud)
当我运行此测试脚本时,我收到以下错误(使用代码标记,因为它不包装):
No handlers could be found for logger "suds.bindings.unmarshaller"
Traceback (most recent call last):
File "sudsTest.py", line 9, in <module>
result = client.service.GetPackageDetails( "t3db" )
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 379, in call
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 422, in call
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 480, in invoke
File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", …Run Code Online (Sandbox Code Playgroud) 我正在使用suds 0.4和python 2.6来与远程服务器通信.
它的WSDL加载完美,但任何函数调用都会返回错误.该服务器出了点问题.
现在我需要获得一个肥皂结构的转储,它被发送到服务器,它的响应,在纯肥皂.
我怎样才能做到这一点?
python ×10
suds ×10
soap ×8
wsdl ×2
inheritance ×1
pickle ×1
soapheader ×1
transport ×1
twisted ×1
wcf ×1
web-services ×1
xml ×1