LINUX.ORG.RU

python soap как правильно

 , ,


0

1

Не работал ранее с soap, навскидку подобрал модуль zeep.
В моём видении я могу через get запрос получить объект, модифицировать его и скормить update запросу.

По факту объекты, которые я получею get запросом содержат поля с None элементами и попытка так это передать далее в update запрос приводит к ValidationError. Предполагаю, что я как-то неправильно это использую и накостылил что-то страшное.

Вот «документация» soap https://bolid.ru/files/373/566/IntegrServ.pdf

Вот мой код (частями)

from zeep import Client, xsd
client = Client(soap_addr)
orion_factory = client.type_factory('urn:OrionProIntf')
keys_request = client.service.GetKeys(0, 0, 0, 0, token)

Я получил ключи, отфильтровал нужные мне, теперь надо поменять оставшиеся

for key in filtered_keys:
    # Костыль 1: я заменяю все None на xsd.SkipValue
    # Костыль в том, как я перебираю ключи объекта
    for name, _ in client.type_factory('urn:OrionProIntf').TKeyData.elements:
        if key.__getattribute__(name) is None:
            key.__setattr__(name, xsd.SkipValue)

    # Set key values for block
    key.IsBlocked = True
    key.Comment = key_block_comment

    # Костыль 2: orion_factory.TKeyData(key) не работает
    # Вот это первое, что пришло в голову и сработало
    key_values = [key.__getattribute__(name) for name, _ in client.type_factory('urn:OrionProIntf').TKeyData.elements]
    key_object = orion_factory.TKeyData(*key_values)

    result = client.service.UpdateKeyData(key_object, token)

Может тут найдётся кто с этим модулем работал, скажите как сделать правильно.

PS. Проверки успешности запросов вида if keys_request.Success я опустил.
PPS. Документацию разработчик не особо то и обновляет, параметры методов немного отличаются от описанного, правильные я беру из wsdl документа самого сервиса.

★★

Покопавших в исходниках пришёл к выводу, что большая часть soap объектов ведут себя как словарь

Проверил, код работает

for key_attr in key:
  if key[key_attr] is None:
    key[key_attr] = xsd.SkipValue

На этом вопрос наверное снят, это более не выглядит как костыль для меня

Flotsky ★★
() автор топика

я с этим работал, и честно скажу, что в бидоне с soap все плохо

делай отдельный микросервис на нормальной платформе (java/dotnet), которая умеет нормально работать с soap, а потом дергай его из питона, скажем через http/rest интерфейс

lovesan ★★
()