使用 Zeep (python) 验证 SOAP 请求时出现问题

Tob*_*ner 5 soap zeep

我在通过 Zeep 获取 SOAP 请求时遇到问题,收到(客户端)验证错误...我还使用 SoapUI 进行了测试,但这并没有给我相同的验证错误...

以下规范来自服务器...根据该规范,需要 OrderStatus 和 SynchStatus 来执行请求。

<soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ xmlns:web="WebServiceProvider">
   <soapenv:Header/>
   <soapenv:Body>
      <web:Order_Get>
         <!--Optional:-->
         <web:orderOptions>
            <web:FromDate>?</web:FromDate>
            <web:ToDate>?</web:ToDate>
            <web:OrderStatus>?</web:OrderStatus>
            <web:SynchStatus>?</web:SynchStatus>
            <!--Optional:-->
            <web:OrderNumber>?</web:OrderNumber>
            <web:FromOrderNumberToLastRecieved>?</web:FromOrderNumberToLastRecieved>
            <web:PaymentStatus>?</web:PaymentStatus>
         </web:orderOptions>
      </web:Order_Get>
   </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

但是,从不带 OrderStatus 和 SynchStatus 的 SoapUI 执行此操作将为我提供指定日期的所有订单的列表:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="WebServiceProvider">
   <soapenv:Header/>
   <soapenv:Body>
      <web:Order_Get>
         <web:orderOptions>
            <web:FromDate>2021-03-30</web:FromDate>
            <web:ToDate>2021-03-31</web:ToDate>
         </web:orderOptions>
      </web:Order_Get>
   </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

我想对 Zeep ( https://github.com/mvantellingen/python-zeep )做同样的事情,但客户端验证失败......

我使用以下代码发起请求:

api_url = 'https://abc.se/Webservice20/v3.0/webservice.asmx?WSDL'
session.auth = HTTPDigestAuth(username, password)
api = Client(api_url, transport=Transport(session=session))
Run Code Online (Sandbox Code Playgroud)

然后我尝试执行以下请求:

order_options = {
  'FromDate': '2021-03-30',
  'ToDate': '2021-03-31',
}
orders = api.service.Order_Get(orderOptions=order_options)
Run Code Online (Sandbox Code Playgroud)

这将导致以下错误:

zeep.exceptions.ValidationError: Missing element OrderStatus (Order_Get.orderOptions.OrderStatus)
Run Code Online (Sandbox Code Playgroud)

如果我将 OrderStatus 添加到请求中,我将收到一条验证错误,指出缺少 SynchStatus。添加完毕后,请求将发送到服务器。

也就是说,zeep 客户端在验证请求中的数据方面似乎比服务器更严格......有没有办法强制客户端跳过此验证?

提前谢谢了!

Tob*_*ner 4

进行了更多搜索,并在这篇文章中找到了解决方法:Getting zeep.exceptions.ValidationError: Missing element for method that work with suds

所以我的案例的解决方案如下所示:

from zeep import xsd
...

order_options = {
  'FromDate': '2021-03-30',
  'ToDate': '2021-03-31',
  'OrderStatus': xsd.SkipValue,
  'SynchStatus': xsd.SkipValue,
}

response = api.service.Order_Get(orderOptions=order_options)
Run Code Online (Sandbox Code Playgroud)

这将阻止 zeep 对参数 OrderStatus 和 SynchStatus 进行客户端验证。