将列表参数传递给zeep方法

2024-10-03 19:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用zeep(v3.4.0)调用一个soap方法,并将对象列表传递给该方法。检查请求的xml表示将显示一个空列表。你知道吗

from lxml import etree
from requests import Session
from requests.auth import HTTPDigestAuth  # or HTTPDigestAuth, or OAuth1, etc.
from zeep import Client
from zeep.transports import Transport

session = Session()
session.auth = HTTPDigestAuth('user', 'pass')
client = Client('http:service.local/services.wsdl',
    transport=Transport(session=session))

factory = client.type_factory('ns0')
o1 = factory.objectTypePrint('name1', 'val1')
o2 = factory.objectTypePrint('name2', 'val2')
o3 = factory.objectTypePrint('name3', 'val3')

node =  client.create_message(client.service, 'printFormat', numbers=1, jobID='test', objects=[o1,o2,o3])

print(etree.tostring(node, pretty_print=True))

结果看起来像

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Body>
    <ns0:printFormatRequest xmlns:ns0="http://www.cab.de/WSSchema">
      <ns0:objects/>
      <ns0:jobID>test</ns0:jobID>
      <ns0:numbers>1</ns0:numbers>
    </ns0:printFormatRequest>
  </soap-env:Body>
</soap-env:Envelope>

这来自wsdl:

<xsd:complexType name="printFormat">
  <xsd:sequence>
    <xsd:element name="objects">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="fObject" minOccurs="0" maxOccurs="unbounded" type="tns:objectTypePrint"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="jobID" type="xsd:string"/>
    <xsd:element name="numbers" type="xsd:int"/>
  </xsd:sequence>
</xsd:complexType>

我希望在<ns0:objects>标记中有一个对象列表,但它是空的。你知道吗


Tags: namefromimportenvclientsessionfactorytype
1条回答
网友
1楼 · 发布于 2024-10-03 19:31:11

我自己解决的。你知道吗

对于其他正在努力解决此问题的人: zeep可以用client.wsdl.dump()显示加载的wsdl信息

结果包含以下内容:

ns0:printFormat(objects: {fObject: ns0:objectTypePrint[]}, jobID: xsd:string, numbers: xsd:int)

因此,此方法的工作代码如下所示:

from lxml import etree
from requests import Session
from requests.auth import HTTPDigestAuth  # or HTTPDigestAuth, or OAuth1, etc.
from zeep import Client
from zeep.transports import Transport

session = Session()
session.auth = HTTPDigestAuth('user', 'pass')
client = Client('http:service.local/services.wsdl',
    transport=Transport(session=session))

factory = client.type_factory('ns0')

o1 = factory.objectTypePrint('name1', 'val1') 
o2 = factory.objectTypePrint('name2', 'val2') 
o3 = factory.objectTypePrint('name3', 'val3') 
o = { 'fObject': [ o1, o2, o3 ] }

node =  client.create_message(client.service, 'printFormat', numbers=1, jobID='test', objects=o)

print(etree.tostring(node, pretty_print=True))

相关问题 更多 >