标签: suds

WCF和Python SUDS之间的XML差异用于继承?

我有一个关于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 wcf inheritance soap suds

15
推荐指数
1
解决办法
1364
查看次数

在python中序列化suds对象

好吧我正在努力改进python,所以我不确定这是开始我正在做什么的正确方法,但这是我目前的问题......

我需要通过SOAP方法获取一些信息,现在只使用部分信息,但存储整个结果以备将来使用(我们需要尽可能少地使用该服务).查找访问服务的最佳方式我认为suds是要走的路,它很简单,就像一个魅力来获取数据.但是现在我想以某种方式保存结果,最好是序列化/在数据库中,这样我以后可以把它拉出来并使用它.

什么是最好的方法,看起来像pickle/json不是一个选项?谢谢!

更新 阅读最佳答案我怎样才能腌泡沫效果?让我更好地了解为什么这不是一个选项,我想我已经卡住了重建一个基本的对象w /我需要的信息?

python soap pickle suds

15
推荐指数
4
解决办法
1万
查看次数

使用SUDS在Python中进行错误处理

我一直试图通过使用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)

python web-services suds

14
推荐指数
2
解决办法
3万
查看次数

你能帮我解决这个SUDS/SOAP问题吗?

所以我试图使用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发送格式正确的请求?

python soap wsdl suds

14
推荐指数
1
解决办法
2万
查看次数

如何将SOAP头传递给未在WSDL文件中定义的python 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消息传递给目标服务?

谢谢

python xml wsdl suds soapheader

14
推荐指数
1
解决办法
2万
查看次数

Python:如何使用Twisted作为SUDS的传输?

我有一个基于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)

python soap twisted suds transport

12
推荐指数
1
解决办法
3287
查看次数

Suds产生空元素; 如何删除它们?

[主要编辑基于两天前第一篇文章以来的经验.]

我正在使用Suds构建Python SOAP/XML脚本,但我很难获得生成服务器可接受的SOAP/XML的代码.我曾经认为问题是Suds没有为内部元素生成前缀,但后来发现缺少前缀(参见Sh-Data和内部元素)不是问题,因为Sh-DataMetaSwitchData元素声明了适当的命名空间(见下文).

<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 suds

12
推荐指数
4
解决办法
6595
查看次数

Python soap使用soaplib(服务器)和suds(客户端)

这个问题与: 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 soap suds

11
推荐指数
1
解决办法
2万
查看次数

Python/Suds:未找到类型:'xs:complexType'

我有以下简单的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)

python soap suds

10
推荐指数
1
解决办法
1万
查看次数

如何在python中使用suds转储我的请求的原始XML和服务器的响应

我正在使用suds 0.4和python 2.6来与远程服务器通信.

它的WSDL加载完美,但任何函数调用都会返回错误.该服务器出了点问题.

现在我需要获得一个肥皂结构的转储,它被发送到服务器,它的响应,在纯肥皂.

我怎样才能做到这一点?

python soap suds

9
推荐指数
1
解决办法
7540
查看次数

标签 统计

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