← Назад к вопросам

Что такое SOAP?

2.2 Middle🔥 71 комментариев
#REST API и HTTP#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SOAP: Simple Object Access Protocol

SOAP — это протокол обмена структурированными данными для вызова удалённых процедур (RPC). Хотя это технология конца 90-х, она ещё используется в legacy системах и enterprise разработке.

Базовые концепции

SOAP = XML-based RPC protocol

Это стандартизированный способ вызвать функцию на удалённом сервере через HTTP, полностью основанный на XML. В отличие от REST, SOAP — это очень структурированный и формальный протокол.

Структура SOAP сообщения

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <!-- Метаданные, аутентификация и т.п. -->
    <auth:Authorization>Bearer token123</auth:Authorization>
  </soap:Header>
  <soap:Body>
    <!-- Основная нагрузка: вызов функции и параметры -->
    <m:GetUser xmlns:m="http://api.example.com/users">
      <m:UserId>42</m:UserId>
    </m:GetUser>
  </soap:Body>
</soap:Envelope>

SOAP vs REST

АспектSOAPREST
ФорматXMLJSON (обычно)
ТранспортHTTP, SMTP, FTPHTTP
ПарадигмаRPC (вызов функции)Resource-based (существительные)
СтандартизацияОчень строгая (WSDL)Гибкая
СложностьВысокаяНизкая
ПроизводительностьМедленнее (много XML)Быстрее (JSON компактнее)
КешированиеСложноВстроено в HTTP
Статус кодыИспользует 200 OK (даже ошибки)Использует 404, 500 и т.п.
БезопасностьWS-Security (встроенная)TLS + OAuth (на приложении)

SOAP сообщение: полный пример

Запрос к веб-сервису:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:api="http://api.bank.com/soap">
  
  <soap:Header>
    <api:Authentication>
      <api:Username>trader_123</api:Username>
      <api:Password>secret</api:Password>
      <api:Token>xyz789</api:Token>
    </api:Authentication>
  </soap:Header>
  
  <soap:Body>
    <api:TransferMoney>
      <api:FromAccount>1234567890</api:FromAccount>
      <api:ToAccount>0987654321</api:ToAccount>
      <api:Amount>10000.00</api:Amount>
      <api:Currency>USD</api:Currency>
    </api:TransferMoney>
  </soap:Body>
</soap:Envelope>

Ответ сервера:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:api="http://api.bank.com/soap">
  
  <soap:Body>
    <api:TransferMoneyResponse>
      <api:TransactionId>TXN-2024-001234</api:TransactionId>
      <api:Status>SUCCESS</api:Status>
      <api:Timestamp>2024-03-22T10:30:00Z</api:Timestamp>
      <api:NewBalance>90000.00</api:NewBalance>
    </api:TransferMoneyResponse>
  </soap:Body>
</soap:Envelope>

SOAP ошибка:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <soap:Fault>
      <faultcode>soap:Server</faultcode>
      <faultstring>Insufficient funds in account</faultstring>
      <detail>
        <api:Error xmlns:api="http://api.bank.com/soap">
          <api:ErrorCode>INSUFFICIENT_BALANCE</api:ErrorCode>
          <api:CurrentBalance>5000.00</api:CurrentBalance>
          <api:RequiredAmount>10000.00</api:RequiredAmount>
        </api:Error>
      </detail>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

WSDL: контракт веб-сервиса

Каждый SOAP сервис описывается в WSDL (Web Services Description Language) — это как OpenAPI для SOAP.

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            targetNamespace="http://api.example.com/soap">
  
  <!-- Определение типов данных -->
  <types>
    <xsd:schema>
      <xsd:element name="GetUserRequest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="userId" type="xsd:int"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </types>
  
  <!-- Сообщения (ввод/вывод) -->
  <message name="GetUserRequest">
    <part name="parameters" element="GetUserRequest"/>
  </message>
  
  <!-- Операция -->
  <operation name="GetUser">
    <input message="GetUserRequest"/>
    <output message="GetUserResponse"/>
  </operation>
  
  <!-- Привязка к HTTP -->
  <binding name="UserServiceBinding" type="UserServicePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetUser">
      <soap:operation soapAction="GetUser"/>
    </operation>
  </binding>
</definitions>

Использование SOAP в Python

from zeep import Client

# Подключение к веб-сервису через WSDL
client = Client(wsdl='http://api.example.com/soap?wsdl')

# Вызов удалённой функции
response = client.service.GetUser(userId=42)
print(response['name'])  # Получить поле из ответа

# С аутентификацией
from zeep import xsd
from requests.auth import HTTPBasicAuth

client = Client(
    wsdl='http://api.example.com/soap?wsdl',
    settings=Settings(strict=False),
)

# Вызов с параметрами
result = client.service.TransferMoney(
    from_account='1234567890',
    to_account='0987654321',
    amount=1000.00,
    currency='USD'
)

Где ещё используется SOAP

  1. Финансовые системы — банки, платёжные системы (интеграция с SWIFT, SEPA)
  2. Governmental services — налоговые, таможенные системы (XML-based)
  3. Enterprise PLC — SAP, Oracle, Microsoft (1С, Битрикс)
  4. Legacy системы — приложения 2000-х годов
  5. Высокая безопасность требуется — WS-Security встроена

Плюсы SOAP

  • ✅ Строгий контракт (WSDL) — клиент и сервер договариваются заранее
  • ✅ Встроенная безопасность (WS-Security, шифрование)
  • ✅ Встроенная типизация (XSD)
  • ✅ Для enterprise — хороший аудит и трассировка
  • ✅ ACID гарантии (WS-AtomicTransaction)

Минусы SOAP

  • ❌ Очень медленно парсить/генерировать XML
  • ❌ Нельзя использовать кеширование (всё POST запросы)
  • ❌ Сложность создания клиентов и серверов
  • ❌ Невозможно отладить в браузере (как REST через curl)
  • ❌ Избыточность — много XML бойлерплейта
  • ❌ Не RESTful — игнорирует HTTP семантику

SOAP vs современные альтернативы

  • REST — проще, стандартнее, но меньше типизации
  • gRPC — быстрее (Protocol Buffers), типизированно, но молодое
  • GraphQL — гибче клиентам, но сложнее на сервере

Когда выбрать SOAP

  • Если нужна строгая типизация и контракт (enterprise)
  • Если работаешь с legacy системой
  • Если требуется встроенная безопасность
  • Если работаешь в финансовом/гос. секторе

Когда выбрать REST

  • Для новых проектов (99% случаев)
  • Если нужна простота и скорость разработки
  • Если интегрируешься с мобильными приложениями
  • Если нужна кеширование

Вывод

SOAP — это архаичный, но всё ещё живой протокол. Хороший разработчик должен понимать его исторический контекст и когда его использовать. Но для новых проектов — выбирай REST, gRPC или GraphQL.

Что такое SOAP? | PrepBro