Это был мой первый день в офисе клиента, и мы все еще не знали, как собирать данные из устаревшей системы управления контентом клиента. Система была очень медленной, работать с ней было почти невыносимо. Чтобы дать вам представление, обновление страницы занимает около 0,5–1 минуты, в то время как мы могли загружать только 10–15 изображений за раз без сбоя системы. Вдобавок к этому нам потребовались тысячи изображений для каждой категории, чтобы создать репрезентативный набор данных для нашей модели глубокого обучения. Итак, вы делаете математику.

Как я сюда попал?

Что ж, мне пришла в голову идея, что мы можем получать данные через запросы, предполагая, что в системе есть REST API, который я мог бы использовать. До этого момента я не слышал о такой вещи, которая называется «SOAP» - позор мне, не говоря уже о том, чтобы знать, как его использовать. На первый взгляд, SOAP может показаться инопланетным инструментом из космоса тем, кто знаком с RESP API, но это определенно не так.

Мне кажется, что почти все API-интерфейсы SOAP представляют собой либо корпоративное программное обеспечение, требующее строгих мер безопасности, либо ретро-инструменты, которые имеют ценность только для хипстеров. Это просто чувство, не судите меня.

Возвращаясь к тому, с чего я начал, мы искали решение, которое могло бы сэкономить нам часы или даже дни на сбор всех необходимых данных. Я подумал о том, чтобы попробовать эту концепцию, используя компьютерный язык, с которым я чувствую себя наиболее комфортно, Python. Я часто использую python для своих повседневных сценариев, однако не было ни одного официального клиента SOAP для python. Затем я засучил рукава и начал искать клиента в сети. Вскоре после этого я наткнулся на одного клиента, который кажется довольно многообещающим и более структурированным, чем другие, «Zeep».

Дайте пять, если вы правильно ответили на обе ссылки! Но я говорю именно об этом зипе. Прежде чем я начну, я должен предупредить вас, что это не будет полный учебник, в котором есть все ответы, касающиеся запросов SOAP. Скорее, это очень простой обзор, который может дать вам подсказку о том, что такое SOAP, и как простой запрос SOAP может быть отправлен через Zeep. Надеюсь, эта статья может сэкономить вам время или, по крайней мере, дать вам быстрый старт.

Что такое SOAP?

SOAP - это просто протокол обмена сообщениями на основе XML для обмена информацией между компьютерами, как подробно описано здесь. Но кто бы хотел писать строки кода XML только для простого запроса? Да, я тоже. Но хорошо то, что нам на самом деле не нужно. Потому что Zeep выполняет за нас всю тяжелую работу, а все, что нам нужно сделать, это создать словарь, содержащий обязательные поля.

В моем случае система клиента имела относительно простую схему XML для запросов. Признаюсь, довольно просто.

<username>user</username>
<password>pass</password>
<doc_id>id</doc_id>

Давайте переведем эту XML-схему в форму словаря Python.

data = {'username': '<my_username>',
        'password': '<my_password>',
        'doc_id': <my_doc_id>}

Есть также еще один интересный компонент, называемый ServiceProxy, который представляет собой объект, который проверяет, определена ли операция для запрашиваемого атрибута или элемента. Стоит упомянуть, что моя операция, то есть «GetDocumentWithID», уже определена в системе. Таким образом, он может вернуть действительный ответ, как только получит необходимые аргументы, например имя пользователя, пароль и doc_id. Затем можно выполнить простой запрос SOAP с помощью функции, представленной ниже.

def send_request(client, data):
    r = client.service.GetDocumentWithID(document=data)
    return r

Но ждать? Чего-то не хватает?

Да, ты прав. Давайте запустим наш клиент Zeep. Это можно просто сделать следующим образом:

from zeep import Client
client = Client(<wsdl_url>)

Поскольку я уже передавал в запросе значения своего имени пользователя и пароля, я мог запустить своего клиента, указав только путь к файлу wsdl. Однако более надежным подходом может быть использование класса UsernameToken, предоставленного Zeep. Используя следующий метод, вы также можете передать свои учетные данные.

from zeep import Client
from zeep.wsse.username import UsernameToken
client = Client(<wsdl_url>, wsse=UsernameToken(<username>, <password>)

Где мой ответ?

Отличный вопрос! Возвращенный объект ответа можно использовать, передав r [‘key’], аналогично словарю Python. Однако объект ответа не является словарем, поэтому его не следует рассматривать как таковой. Предполагая, что нашим целевым атрибутом является «данные», следующий фрагмент кода распечатывает запрошенную информацию.

from zeep import Client
cl = Client(<wsdl_url>)
req_data = {'username': '<my_username>',
        'password': '<my_password>',
        'doc_id': <my_doc_id>}
def send_request(client, data):
    r = client.service.GetDocumentWithID(document=data)
    return r
r = send_request(cl, req_data)
print(r['data'])

Последние слова

Я надеюсь, что эта статья поможет вам сделать ваши первые запросы SOAP на Python и сэкономит вам время, тратя часы на просмотр страниц документации для выполнения очень простой задачи. Здесь вы можете взглянуть на мой скрипт на GitHub Gist, если хотите увидеть полный код.

И последнее, но не менее важное: я хотел бы поблагодарить Адриенн за ее потрясающую работу здесь. Ее статья не только ускорила мои первые шаги, но и вдохновила меня написать свою собственную историю, как будто людям нужно больше историй о SOAP.

Ну, неее-вер-ум.