Zeep: предварительная проверка с проверкой типов - PullRequest
1 голос
/ 07 мая 2020

Есть ли способ проверить полезную нагрузку с проверкой типов с помощью 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
...