SOAP, WSDL і трохи Python: створюємо веб-сервіс крок за кроком

У світі REST API часто забувають про інший стандарт — SOAP. Цей протокол і досі широко використовується у великих організаціях, банках, телекомі та державному секторі. У цій статті ми розглянемо, як створити SOAP веб-сервіс на Python, використовуючи бібліотеку Spyne, і як працює WSDL-файл.

Що таке SOAP і WSDL?

  • SOAP (Simple Object Access Protocol) — це протокол обміну структурованими повідомленнями, зазвичай у форматі XML. Він формалізує передачу даних через HTTP або SMTP.
  • WSDL (Web Services Description Language) — це XML-файл, який описує доступні методи веб-сервісу, типи параметрів, структури запитів і відповідей.

Коли варто використовувати SOAP?

SOAP ідеально підходить для:

  • контрактно-орієнтованих API;
  • інтеграції зі сторонніми системами;
  • високого рівня безпеки (WS-Security);
  • складних типів даних та операцій.

Встановлення бібліотек

Для Python одним з найзручніших рішень є Spyne. Встановімо:

pip install spyne lxml

Створення простого SOAP-сервісу

from spyne import Application, rpc, ServiceBase, Integer, Unicode
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication

class HelloWorldService(ServiceBase):
    @rpc(Unicode, Integer, _returns=Unicode)
    def say_hello(ctx, name, times):
        return u' '.join([f"Привіт, {name}!" for _ in range(times)])

application = Application([
    HelloWorldService
],
    tns='spyne.examples.hello',
    in_protocol=Soap11(validator='lxml'),
    out_protocol=Soap11()
)

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    wsgi_app = WsgiApplication(application)
    server = make_server('127.0.0.1', 8000, wsgi_app)
    print("Сервер працює на http://127.0.0.1:8000")
    server.serve_forever()

Отримання WSDL

Після запуску сервера ви можете перейти на:

http://127.0.0.1:8000/?wsdl

Ви побачите WSDL-документ, який описує ваш веб-сервіс. Його можуть використовувати інші системи або розробники для автоматичної генерації клієнтів.

Тестування SOAP-сервісу

Для тестування можна використовувати Postman або SoapUI. У запиті потрібно вказати правильний SOAP Envelope:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:spy="spyne.examples.hello">
   <soapenv:Header/>
   <soapenv:Body>
      <spy:say_hello>
         <spy:name>Світ</spy:name>
         <spy:times>2</spy:times>
      </spy:say_hello>
   </soapenv:Body>
</soapenv:Envelope>

Висновок

SOAP — це не архаїзм, а потужний інструмент, який досі актуальний у багатьох сферах. Завдяки бібліотеці Spyne ми можемо легко створити повноцінний SOAP-сервіс на Python із доступом до WSDL, підтримкою XML і серіалізацією/десеріалізацією складних типів.