В Zato ESB и сервере приложений в Python появились дополнительные средства, благодаря которым теперь еще проще вызывать SOAP-сервисы без необходимости создания классов-заглушек или клиентов.
Учитывая существующий WSDL, все, что нужно, это заполнить пару форм, и пул клиентов SOAP автоматически генерируется и доступен в кластере.
Эта функция, созданная на основе Suds , доступна в git master, и здесь представлен предварительный просмотр, показывающий, как использовать сервисы SOAP без необходимости прямых манипуляций с XML для создания сервиса RESTful, проверяющего номера кредитных карт с выводом JSON.
Сначала давайте загрузим сервис, который будет подключаться к SOAP и генерировать JSON на выходе.
Обратите внимание, что служба на самом деле не знает, какой тип вывода она производит — это настраивается с помощью графического интерфейса, и никаких изменений кода не требуется, чтобы служба производила XML вместо JSON.
# -*- coding: utf-8 -*- # Zato from zato.server.service import Service class ValidateCreditCard(Service): class SimpleIO: input_required = ('number',) output_required = ('card_type', 'is_valid') def handle(self): conn = self.outgoing.soap['Credit Card Validator'].conn with conn.client() as client: # Invoke SOAP dynamically - no need for stub classes result = client.service.CheckCC(self.request.input.number) # Results are turned into Python objects automatically self.response.payload.card_type = result.CardType self.response.payload.is_valid = result.CardValid
Хотя это и не обязательно, допустим, нам нужно защитить нашу службу REST с помощью Basic Auth:
Теперь создается канал, через который будут поступать запросы. Обратите внимание, что путь URL является шаблоном — все именованные атрибуты, такие как * число * здесь, доступны в качестве входных данных для служб.
И хотя это не используется в этом примере, JSON или XML можно смешивать при вводе с параметрами URL с полным контролем того, что имеет приоритет над другими частями.
Далее необходимо исходящее SOAP-соединение. Обратите внимание, что его тип сериализации — Suds — это новая функция. WSDL указывает на бесплатный сервис SOAP онлайн
В приведенном ниже примере каждому серверу будет предоставлен пул из 20 клиентов SOAP, каждый из которых будет сгенерирован динамически на лету из WSDL, предоставленного на входе.
Если вы пришли из Java или C # фона, вы заметите, что не нужно генерировать заглушки или клиентские классы. Все это решается за кулисами, поэтому можно сразу же сосредоточиться на вызове сервисов SOAP.
Имея все это, сервис Zato теперь может быть вызван. curl используется из командной строки в примерах ниже:
$ curl -u user:password localhost:17010/validate-cc/4111111111111111 {"response": {"card_type": "VISA", "is_valid": true}} $
$ curl -u user:password localhost:17010/validate-cc/123456789 {"response": {"card_type": "NONE", "is_valid": false}} $
Что если WSDL меняется со временем? Вам нужно только нажать «Перезагрузить WSDL», и будет создан новый пул клиентов SOAP с использованием самого нового содержимого.
Эта функция будет выпущена в следующей версии 1.2 и до тех пор — пожалуйста, используйте git master