Python 缺少必需标记的Zeep发送请求

Python 缺少必需标记的Zeep发送请求,python,soap,xsd,wsdl,zeep,Python,Soap,Xsd,Wsdl,Zeep,我的SOAP服务将使用各种无效有效负载进行测试,以确认是否返回了适当的响应 在进行测试之前,我想对我的服务进行我自己的测试。一些测试涉及删除强制字段。我想使用zeep模拟这些测试,但zeep不允许我发送请求,如果我要发送的数据中没有任何必填字段,则会给我一个zeep.exceptions.ValidationError 我是否可以配置一些设置,以便zeep不会对缺少的字段抛出错误并发送无效请求 示例代码: from zeep import Client from datetime import

我的SOAP服务将使用各种无效有效负载进行测试,以确认是否返回了适当的响应

在进行测试之前,我想对我的服务进行我自己的测试。一些测试涉及删除强制字段。我想使用zeep模拟这些测试,但zeep不允许我发送请求,如果我要发送的数据中没有任何必填字段,则会给我一个
zeep.exceptions.ValidationError

我是否可以配置一些设置,以便zeep不会对缺少的字段抛出错误并发送无效请求

示例代码:

from zeep import Client
from datetime import datetime

wsdl_url = 'http://myservice.com/egservice?wsdl'

payload = {
    'ServiceType': 'EgService',
    'AvailabilityWindow': [
        {'StartDateTime': datetime.now(),
         'EndDateTime': datetime.now(),
         'Validation': 'VALID'}],
    'Confirmation': 'Confirmed',
    'DateTimeStamp': datetime.now()
}  # N.B No ContractID included

soap_client = Client(wsdl_url)
operation = 'myExampleOperation'
with soap_client.settings(raw_response=True):
    response = soap_client.service[operation](**payload)
wsdl的相关部分:

<xs:complexType name="EgMessage">
    <xs:sequence>
        <xs:element name="ServiceType" type="tns:EgMessage_ServiceTypeType"/>
        <xs:element name="ContractID" type="tns:EgMessage_ContractIDType"/>
        <xs:element name="AUI" type="tns:EgMessage_AUIType" minOccurs="0"/>
        <xs:element name="AvailabilityWindow" type="tns:AvailabilityWindowType" maxOccurs="unbounded"/>
        <xs:element name="Confirmation" type="tns:EgMessage_ConfirmationType"/>
        <xs:element name="FileReason" type="tns:EgMessage_FileReasonType" minOccurs="0"/>
        <xs:element name="DateTimeStamp" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>

回溯:

Traceback (most recent call last):
  File "C:/Users/Thomas.Gabereau/PycharmProjects/pas_rmq/pas_gateway/inbound/test_local_soap.py", line 157, in <module>
    status, fault_field, fault = send_to_grid(soap_client, operation, payload)
  File "C:/Users/Thomas.Gabereau/PycharmProjects/pas_rmq/pas_gateway/inbound/test_local_soap.py", line 129, in send_to_grid
    response = soap_client.service[operation](**payload)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\proxy.py", line 45, in __call__
    kwargs,
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\wsdl\bindings\soap.py", line 119, in send
    operation, args, kwargs, client=client, options=options
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\wsdl\bindings\soap.py", line 68, in _create
    serialized = operation_obj.create(*args, **kwargs)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\wsdl\definitions.py", line 215, in create
    return self.input.serialize(*args, **kwargs)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\wsdl\messages\soap.py", line 74, in serialize
    self.body.render(body, body_value)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\elements\element.py", line 231, in render
    self._render_value_item(parent, value, render_path)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\elements\element.py", line 255, in _render_value_item
    return self.type.render(node, value, None, render_path)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\types\complex.py", line 279, in render
    element.render(parent, element_value, child_path)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\elements\indicators.py", line 242, in render
    element.render(parent, element_value, child_path)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\elements\element.py", line 225, in render
    self.validate(value, render_path)
  File "C:\Users\Thomas.Gabereau\PycharmProjects\pas_rmq\venv\lib\site-packages\zeep\xsd\elements\element.py", line 280, in validate
    "Missing element %s" % (self.name), path=render_path
zeep.exceptions.ValidationError: Missing element ContractID(myExampleOperation.ContractID)
回溯(最近一次呼叫最后一次):
文件“C:/Users/Thomas.Gabereau/PycharmProjects/pas_rmq/pas_gateway/inbound/test_local_soap.py”,第157行,in
状态,fault_字段,fault=send_to_网格(soap_客户端,操作,有效负载)
文件“C:/Users/Thomas.Gabereau/PycharmProjects/pas_rmq/pas_gateway/inbound/test_local_soap.py”,第129行,发送到网格
响应=soap_客户端服务[操作](**有效负载)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\proxy.py”,第45行,在调用中__
夸尔斯,
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\wsdl\bindings\soap.py”,第119行,在send中
操作,args,kwargs,client=client,options=options
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\wsdl\bindings\soap.py”,第68行,在创建
序列化=操作对象创建(*args,**kwargs)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\wsdl\definitions.py”,第215行,在create中
返回self.input.serialize(*args,**kwargs)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\wsdl\messages\soap.py”,第74行,序列化
self.body.render(body,body\u值)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\elements\element.py”,第231行,在render中
self.\u render\u value\u项(父项、值、render\u路径)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\elements\element.py”,第255行,在“渲染值”项中
返回self.type.render(节点、值、无、渲染路径)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\types\complex.py”,第279行,在render中
渲染(父元素、元素值、子元素路径)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\elements\indicators.py”,第242行,在render中
渲染(父元素、元素值、子元素路径)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\elements\element.py”,第225行,在render中
自我验证(值、渲染路径)
文件“C:\Users\Thomas.Gabereau\PycharmProjects\pas\u rmq\venv\lib\site packages\zeep\xsd\elements\element.py”,第280行,验证
“缺少元素%s”%(self.name),路径=呈现路径
zeep.exceptions.ValidationError:缺少元素contracted(myExampleOperation.contracted)

我遇到了同样的问题,然后找到了解决这个问题的方法。有一个选项可以跳过对必填字段的验证。您必须将要跳过的属性的值设置为xsd.skipvalue。在您的场景中,在负载对象中将construcd的值设置为xsd.skipvalue

from zeep import xsd

payload = {
    'ServiceType': 'EgService',
    'ContractID':xsd.SkipValue,
    'AvailabilityWindow': [
        {'StartDateTime': datetime.now(),
         'EndDateTime': datetime.now(),
         'Validation': 'VALID'}],
    'Confirmation': 'Confirmed',
    'DateTimeStamp': datetime.now()
}   

我面对同样的问题,然后找到了解决这个问题的办法。有一个选项可以跳过对必填字段的验证。您必须将要跳过的属性的值设置为xsd.skipvalue。在您的场景中,在负载对象中将construcd的值设置为xsd.skipvalue

from zeep import xsd

payload = {
    'ServiceType': 'EgService',
    'ContractID':xsd.SkipValue,
    'AvailabilityWindow': [
        {'StartDateTime': datetime.now(),
         'EndDateTime': datetime.now(),
         'Validation': 'VALID'}],
    'Confirmation': 'Confirmed',
    'DateTimeStamp': datetime.now()
}   

你能分享你的代码片段和堆栈跟踪吗?我用一些示例代码编辑了我的问题,这些代码准确地代表了我的问题。我希望这足以表达这个问题。我认为最好更改一些细节,以防潜在的敏感度。但问题的关键是,我认为这可以通过任何具有强制字段的操作重新创建,并且有效负载不包括强制字段。似乎收缩是强制的。请尝试输入空字符串或一些随机值。@Theone1谢谢,但我知道这是必须的。我想问的是,是否有一种方法可以发送完全丢失标记的请求,从而在测试原因时导致错误。是否可以共享代码片段和堆栈跟踪?我用一些示例代码编辑了我的问题,这些示例代码准确地代表了我的问题。我希望这足以表达这个问题。我认为最好更改一些细节,以防潜在的敏感度。但问题的关键是,我认为这可以通过任何具有强制字段的操作重新创建,并且有效负载不包括强制字段。似乎收缩是强制的。请尝试输入空字符串或一些随机值。@Theone1谢谢,但我知道这是必须的。我询问是否有一种方法可以发送完全丢失标记的请求,从而出于测试原因故意导致错误