Статьи

Безопасный, масштабируемый и динамический вызов SOAP в Python с Zato и Suds

В 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: Форма для создания определения базовой аутентификации HTTP

Теперь создается канал, через который будут поступать запросы. Обратите внимание, что путь URL является шаблоном — все именованные атрибуты, такие как * число * здесь, доступны в качестве входных данных для служб.

И хотя это не используется в этом примере, JSON или XML можно смешивать при вводе с параметрами URL с полным контролем того, что имеет приоритет над другими частями.Форма для создания нового HTTP-канала

Далее необходимо исходящее SOAP-соединение. Обратите внимание, что его тип сериализации — Suds — это новая функция. WSDL указывает на бесплатный сервис SOAP онлайн
предоставлено CDYNE
,

В приведенном ниже примере каждому серверу будет предоставлен пул из 20 клиентов SOAP, каждый из которых будет сгенерирован динамически на лету из WSDL, предоставленного на входе.

Если вы пришли из Java или C # фона, вы заметите, что не нужно генерировать заглушки или клиентские классы. Все это решается за кулисами, поэтому можно сразу же сосредоточиться на вызове сервисов SOAP.Форма для создания нового исходящего соединения 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 с использованием самого нового содержимого.Стрелка указывает на ссылку, по которой можно перезагрузить WSDL

Эта функция будет выпущена в следующей версии 1.2 и до тех пор — пожалуйста, используйте git master
версия.