Zeep python SOAP 客户端在参数中发送空值

Zeep python SOAP client sending empty value in the argument

有一个外部 SOAP 服务器,我正在尝试使用 python-django 框架和 zeep 库连接并发出请求。

WSDL 转储如下:

Prefixes:
 xsd: http://www.w3.org/2001/XMLSchema
 ns0: http://tempuri.org/

Global elements:
 ns0:GetJobCards(key: xsd:string, technicianID: xsd:string, jobCardNumber: xsd:string, jobcards: ns0:ArrayOfJobCardsEnt, message: xsd:string)
 ns0:GetJobCardsResponse(GetJobCardsResult: xsd:boolean, jobcards:ns0:ArrayOfJobCardsEnt, message: xsd:string)

Global types:
  xsd:anyType
  ns0:ArrayOfJobCardsEnt(JobCardsEnt: {schema: , _value_1: ANY}[])
  xsd:ID
  xsd:IDREF
  xsd:IDREFS
  xsd:NCName
  xsd:NMTOKEN
  xsd:NMTOKENS
  xsd:NOTATION
  xsd:Name
  xsd:QName
  xsd:anySimpleType
  xsd:anyURI
  xsd:base64Binary
  xsd:boolean
  xsd:byte
  xsd:date
  xsd:dateTime
  xsd:decimal
  xsd:double
  xsd:duration
  xsd:float
  xsd:gDay
  xsd:gMonth
  xsd:gMonthDay
  xsd:gYear
  xsd:gYearMonth
  xsd:hexBinary
  xsd:int
  xsd:integer
  xsd:language
  ....


  Bindings:
   Soap11Binding: {http://tempuri.org/}CallSoap
   Soap12Binding: {http://tempuri.org/}CallSoap12

  Service: Call
   Port: CallSoap (Soap11Binding: {http://tempuri.org/}CallSoap)
   Operations:
      GetJobCards(key: xsd:string, technicianID: xsd:string, 
      jobCardNumber: xsd:string, jobcards: ns0:ArrayOfJobCardsEnt, 
      message: xsd:string) -> GetJobCardsResult: xsd:boolean, 
      jobcards: ns0:ArrayOfJobCardsEnt, message: xsd:string

  ....(some other operations)

其中一个调用是获取具有以下架构的工作卡列表

<s:element name="GetJobCards">
 <s:complexType>
  <s:sequence>
   <s:element minOccurs="0" maxOccurs="1" name="key" type="s:string"/>
   <s:element minOccurs="0" maxOccurs="1" name="technicianID" type="s:string"/>
   <s:element minOccurs="0" maxOccurs="1" name="jobCardNumber" type="s:string"/>
   <s:element minOccurs="0" maxOccurs="1" name="jobcards" type="tns:ArrayOfJobCardsEnt"/>
   <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string"/>
  </s:sequence>
 </s:complexType>
</s:element>

<s:complexType name="ArrayOfJobCardsEnt">
 <s:sequence>
  <s:element minOccurs="0" maxOccurs="unbounded" name="JobCardsEnt" nillable="true">
   <s:complexType>
    <s:sequence>
     <s:element ref="s:schema"/>
     <s:any/>
    </s:sequence>
   </s:complexType>
  </s:element>
 </s:sequence>
</s:complexType>

当我使用 Postman 拨打电话时,我发送了以下请求并且它有效:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <GetJobCards xmlns="http://tempuri.org/">
        <key>some_valid_key</key>
        <technicianID>some_technician_id</technicianID>
        <jobCardNumber></jobCardNumber>
        <jobcards></jobcards>
        <message>""</message>
    </GetJobCards>
</soap:Body>

请注意,"jobCardNumber" 和 "jobcards" 的值必须为空才能获得所有工作卡。但我似乎无法使用 zeep 库复制相同的调用。

这是我试过的。

1 - 尝试为空值添加 xsd.SkipValue

request_data = {
  'key': some_valid_key,
  'technicianID': some_technician_ID,
  'jobCardNumber': xsd.SkipValue,
  'jobcards': xsd.SkipValue,
  'message': ''
}
response_body = client.service.GetJobCards(**request_data)

2 - 将值设置为 Nil

from zeep.xsd import Nil

jobCardEnt = client.get_type('ns0:ArrayOfJobCardsEnt')
jobCardEnt = jobCardEnt()
request_data = {
  'key': some_valid_key,
  'technicianID': some_technician_ID,
  'jobCardNumber': Nil,
  'jobcards': Nil,
  'message': ''
}
response_body = client.service.GetJobCards(**request_data)

None 这些似乎有效,但我不确定如何让它起作用。

有人可以指导我吗?

提前致谢!

这是我如何让它工作的

with self.client.settings(strict=False):
        response_body = self.client.service.GetJobCards(
            key=some_valid_key,
            technicianID=some_technician_id,
            message=''
        )

并省略了 'jobCardNumber' 和 'jobcards'

的值