使用 Zeep 验证 SOAP 请求时出现问题 (python)
Problem with validation of SOAP request with Zeep (python)
我在通过 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>
但是,在没有 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>
我想对 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))
然后我尝试执行以下请求:
order_options = {
'FromDate': '2021-03-30',
'ToDate': '2021-03-31',
}
orders = api.service.Order_Get(orderOptions=order_options)
这将导致以下错误:
zeep.exceptions.ValidationError: Missing element OrderStatus (Order_Get.orderOptions.OrderStatus)
如果我将 OrderStatus 添加到请求中,我将收到一个验证错误,指出缺少 SynchStatus。当它也被添加时,请求被发送到服务器。
即似乎 zeep 客户端在验证请求中的数据方面比服务器更严格......有没有办法强制客户端跳过此验证?
非常感谢!
it seems like the zeep client is more strict with regards to validating the data in the request than what the server is...
看起来像。
查看SoapUI基于WSDL生成的请求,你说的两个字段是必填项:
<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>
所以zeep客户端显示的错误是正确的。 Zeep 检查 WSDL 并生成相应的代码以使用合约中的类型。您的 WSDL 合同规定 OrderStatus
和 SynchStatus
是强制性的。服务器不验证它们的事实表明存在问题:Web 服务不遵守它自己记录的合同
WSDL 和 Web 服务的行为应该相同。我建议您联系 Web 服务所有者并询问此行为。它可能是服务器上缺少验证,而你得到的只是它的一些副作用,或者行为是故意的但有人忘记更新 WSDL 说你也可以在没有这些参数的情况下进行调用。
同时,解决方法非常简单。下载 WSDL,将其更改为使这两个字段可选,然后将更改后的 WSDL 提供给 zeep 以生成代码,而不是使用原始 WSDL。但是,您应该向网络服务提供商澄清这一点。如果这确实是某人的疏忽,这可能会在某个时候被发现并修复,使您的解决方法调用由于缺少字段而无法通过服务器验证。
进一步搜索并在 post 中找到了解决方法:
所以我的解决方案如下所示:
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)
这将阻止 zeep 对参数 OrderStatus 和 SynchStatus 进行客户端验证。
我在通过 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>
但是,在没有 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>
我想对 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))
然后我尝试执行以下请求:
order_options = {
'FromDate': '2021-03-30',
'ToDate': '2021-03-31',
}
orders = api.service.Order_Get(orderOptions=order_options)
这将导致以下错误:
zeep.exceptions.ValidationError: Missing element OrderStatus (Order_Get.orderOptions.OrderStatus)
如果我将 OrderStatus 添加到请求中,我将收到一个验证错误,指出缺少 SynchStatus。当它也被添加时,请求被发送到服务器。
即似乎 zeep 客户端在验证请求中的数据方面比服务器更严格......有没有办法强制客户端跳过此验证?
非常感谢!
it seems like the zeep client is more strict with regards to validating the data in the request than what the server is...
看起来像。
查看SoapUI基于WSDL生成的请求,你说的两个字段是必填项:
<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>
所以zeep客户端显示的错误是正确的。 Zeep 检查 WSDL 并生成相应的代码以使用合约中的类型。您的 WSDL 合同规定 OrderStatus
和 SynchStatus
是强制性的。服务器不验证它们的事实表明存在问题:Web 服务不遵守它自己记录的合同
WSDL 和 Web 服务的行为应该相同。我建议您联系 Web 服务所有者并询问此行为。它可能是服务器上缺少验证,而你得到的只是它的一些副作用,或者行为是故意的但有人忘记更新 WSDL 说你也可以在没有这些参数的情况下进行调用。
同时,解决方法非常简单。下载 WSDL,将其更改为使这两个字段可选,然后将更改后的 WSDL 提供给 zeep 以生成代码,而不是使用原始 WSDL。但是,您应该向网络服务提供商澄清这一点。如果这确实是某人的疏忽,这可能会在某个时候被发现并修复,使您的解决方法调用由于缺少字段而无法通过服务器验证。
进一步搜索并在 post 中找到了解决方法:
所以我的解决方案如下所示:
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)
这将阻止 zeep 对参数 OrderStatus 和 SynchStatus 进行客户端验证。