我马上为我的蹩脚英语道歉。
我有一个问题,通过zeep客户端发送多个值。有一个条件方法
<s:element name="GetSomething">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="id" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
如果我需要得到一个值,那么没有问题。我正在使用这个代码:
WSDL = 'example.asmx?WSDL'
session = Session()
transport = Transport(session=session)
client = Client(wsdl=WSDL, transport=transport)
res = client.service.GetCompanyExtendedReport(id='1')
print(res)
但是如果我需要得到多个值。我将给出一个示例xml
<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
<s11:Body>
<ns1:GetSomething xmlns:ns1='http://examplesoapapi.ru/idk'>
<ns1:id>1</ns1:id>
<ns1:id>2</ns1:id>
<ns1:id>3</ns1:id>
<ns1:id>4</ns1:id>
<ns1:id>5</ns1:id>
</ns1:GetStateContractReport>
</s11:Body>
</s11:Envelope>
然后我不明白我怎么能发送此类请求通过zeep
WSDL = 'example.asmx?WSDL'
session = Session()
transport = Transport(session=session)
client = Client(wsdl=WSDL, transport=transport)
res = client.service.GetCompanyExtendedReport(id='1', id='2', id='3', ???)
print(res)
很明显,我可以在循环中发送这样的请求,但这不是我需要的…
你不能。
您的id
元素定义为:
<s:element minOccurs="0" maxOccurs="1" name="id" type="s:string"/>
表示0或1个id
。不是更多。
你需要为更多的调用做一个循环,或者你在你的服务中寻找另一个接受id
s列表的操作,而不仅仅是0或1(如果存在的话)。
即使您像示例中那样进行调用,服务也将至多使用一个请求,或者它将完全拒绝请求,原因很简单,因为SOAP是一种协议,并且SOAP服务具有定义的特定契约。它接受符合该契约的请求,而不是您希望拥有的请求(阅读此以获得扩展解释)。