Есть ли способ проверить полезную нагрузку с проверкой типов с помощью zeep? Zeep проверяет отсутствующие элементы, но отправляет полезную нагрузку, даже если тип неверен.
Пример, у меня есть элемент:
<element name="order_date" type="dateTime" minOccurs="1" maxOccurs="1"/>
Когда я отправляю неправильный тип, например '1.0'
для этого поля, zeep все равно принимает его. Позже я получаю zeep.exceptions.Fault
обратно, потому что SOAP сервер отклоняет мои запросы из-за этого неправильного типа, поскольку он должен быть датирован в формате ISO
Я нашел способ сделать это, предварительно создав сообщение, а затем проверить его с помощью схемы, предоставленной в файле wsdl
с библиотекой lxml
. Это работает хорошо, но я не уверен, правильно ли я использую zeep
, может быть, он также поддерживает его из коробки? Я просмотрел исходный код и не нашел слишком много. Я знаю, что zeep
использует проверку типов для перевода SOAP ответов обратно в Python, но не уверен в предварительной проверке.
Мой текущий способ справиться с этим:
# There are some missing variables, don't want to CP everything
from lxml import etree as ET
def get_xmlschema():
wsdl_file = ...
wsdl_tree = ET.fromstring(wsdl_file)
return ET.XMLSchema(wsdl_tree.find('.//schema:schema', namespaces=NAMESPACES))
def prevalidate_soap_message(client, operation, *args, **kwargs):
# zeep checks only required elements and doesn't perform type checking
msg = client.create_message(client.service, operation, *args, **kwargs)
payload = msg.find('*/')
get_xmlschema().assertValid(payload)
И вот как я отправляю свои данные для контекста:
client = zeep.Client(wsdl)
operation = client.service[operation_name]
payload = ... # this is python object with structure as in wsdl schema for that operation
result = operation(payload) # it raises ValidationError if elements are missing but not for types