Особенности SOAP
SOAP — XML-протокол для корпоративных интеграций. Особенности: строгая типизация (XML Schema, валидация до бизнес-логики), формальный контракт WSDL (описание операций, типов, автогенерация клиентов), расширяемость через SOAP Headers (метаданные: безопасность, транзакции, маршрутизация), независимость от транспорта (HTTP, SMTP, JMS, TCP), встроенная безопасность WS-Security (подпись, шифрование, аутентификация на уровне сообщений), надёжность WS-ReliableMessaging (гарантированная доставка, упорядочивание), распределённые транзакции WS-AtomicTransaction (ACID, двухфазная фиксация), поддержка stateful (сохранение контекста между вызовами), многословность (XML в 10-20 раз больше JSON). REST в отличие от SOAP: stateless, почти всегда HTTP, полагается на TLS (не на подпись сообщений), нет встроенных транзакций и надёжности. SOAP применяется там, где нужны эти стандарты: банки, страховые, госсектор.
Введение: Что делает SOAP уникальным
В предыдущей теме мы разобрали, что такое SOAP — протокол обмена XML-сообщениями для корпоративных интеграций. Но что делает SOAP особенным? Почему в мире, где REST кажется проще и удобнее, SOAP всё ещё жив и активно используется в банках, страховых компаниях и государственных системах?
Ответ — в особенностях SOAP. Это не просто “XML поверх HTTP”. SOAP — это целая экосистема стандартов, которые вместе обеспечивают безопасность, надёжность, транзакционность и формальные контракты. Там, где REST требует “допилить” эти механизмы вручную, SOAP предоставляет их “из коробки”.
Особенности SOAP — это набор характеристик и расширений протокола, которые делают его пригодным для сложных корпоративных сценариев: строгая типизация, формальные контракты (WSDL), встроенная безопасность (WS-Security), поддержка транзакций (WS-AtomicTransaction), гарантированная доставка (WS-ReliableMessaging) и независимость от транспорта.
Понимание этих особенностей помогает ответить на вопрос: “Почему банк использует SOAP, а не REST?”
1. Строгая типизация (Strong Typing)
Что это значит
SOAP использует XML Schema (XSD) для описания типов данных. Каждое поле имеет явно указанный тип: строка, число, дата, массив и так далее.
<!-- XSD определение типа -->
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Email" type="xsd:string"/>
<xsd:element name="CreatedAt" type="xsd:dateTime"/>
<xsd:element name="Balance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>Почему это важно
| Аспект | Объяснение |
|---|---|
| Валидация | Сообщение можно проверить на соответствие схеме ДО обработки |
| Предсказуемость | Клиент точно знает, какие типы данных ожидать |
| Автоматическая генерация | Инструменты могут генерировать типизированные классы |
| Ошибки на ранней стадии | Неправильный тип отлавливается до бизнес-логики |
Пример: Ошибка типизации
<!-- Неправильно: Id должен быть числом -->
<soap:Body>
<GetUser>
<UserId>abc</UserId> <!-- Ошибка! Ожидается int -->
</GetUser>
</soap:Body>Сервер вернёт ошибку валидации ДО того, как вызов дойдёт до бизнес-логики.
REST аналогия
В REST типизация отсутствует. Это и плюс (гибкость), и минус (меньше гарантий).
{
"id": "123", // Может быть строкой или числом — не определено
"created_at": "2024-01-15" // Строка, не дата
}Клиент должен догадываться или читать документацию.
2. Формальный контракт (WSDL)
Что это значит
Каждый SOAP сервис описывается WSDL (Web Services Description Language) — XML документом, который формально описывает:
- Какие операции доступны
- Какие параметры принимает каждая операция
- Какие типы данных используются
- Где находится сервис (URL)
- Какой транспорт используется
Пример фрагмента WSDL
<portType name="UserPort">
<operation name="GetUser">
<input message="tns:GetUserRequest"/>
<output message="tns:GetUserResponse"/>
<fault message="tns:UserNotFoundFault"/>
</operation>
</portType>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Самодокументируемость | WSDL — это документация, которую можно прочитать машина |
| Автоматическая генерация клиентов | Инструменты создают клиентский код по WSDL |
| Проверка совместимости | Можно проверить, что клиент и сервер “говорят на одном языке” |
| Обнаружение сервисов (UDDI) | Можно искать сервисы по реестру |
REST аналогия
В REST формального контракта нет. OpenAPI (Swagger) — попытка создать аналог, но он не обязателен и не встроен в протокол.
# OpenAPI — опциональная документация, не контракт
openapi: 3.0.0
paths:
/users/{id}:
get:
parameters:
- name: id
in: path
required: true
schema:
type: integer3. Расширяемость через заголовки (SOAP Headers)
Что это значит
SOAP сообщение имеет отдельную секцию <soap:Header>, которая может содержать любые метаданные, не влияющие на основное тело.
<soap:Envelope>
<soap:Header>
<!-- Аутентификация -->
<wsse:Security>...</wsse:Security>
<!-- Информация о транзакции -->
<wsat:AtomicTransaction>...</wsat:AtomicTransaction>
<!-- Маршрутизация -->
<wsrm:Sequence>...</wsrm:Sequence>
<!-- Пользовательские заголовки -->
<myapp:CorrelationId>abc-123</myapp:CorrelationId>
<myapp:TenantId>tenant-456</myapp:TenantId>
</soap:Header>
<soap:Body>
<!-- Основное сообщение -->
</soap:Body>
</soap:Envelope>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Разделение метаданных и данных | Безопасность, транзакции, маршрутизация — в заголовках |
| Стандартизация | WS-Security, WS-AtomicTransaction — стандартные заголовки |
| Промежуточная обработка | Прокси, шлюзы могут читать заголовки без парсинга тела |
| Расширяемость | Легко добавить новый заголовок без изменения Body |
REST аналогия
В REST метаданные передаются в HTTP заголовках.
Authorization: Bearer token123
X-Correlation-Id: abc-123
X-Tenant-Id: tenant-456Но HTTP заголовки ограничены по длине и не имеют стандартизированных расширений для транзакций и надёжности.
4. Независимость от транспорта (Transport Independence)
Что это значит
SOAP не привязан к HTTP. Одно и то же SOAP сообщение может быть отправлено через:
- HTTP / HTTPS (самый распространённый)
- SMTP (электронная почта)
- JMS (Java Message Service — очереди)
- MSMQ (Microsoft Message Queuing)
- TCP (прямое сокетное соединение)
Пример: SOAP через SMTP
From: client@example.com
To: soap-service@example.com
Subject: SOAP Request
<?xml version="1.0"?>
<soap:Envelope ...>
<soap:Body>
<GetUser>
<UserId>123</UserId>
</GetUser>
</soap:Body>
</soap:Envelope>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Асинхронная обработка | Через SMTP или очереди |
| Интеграция с legacy системами | Работа через уже существующие каналы |
| Высокая надёжность | Очереди гарантируют доставку |
| Разгрузка синхронных вызовов | Не нужно ждать ответа синхронно |
REST аналогия
REST почти всегда работает через HTTP/HTTPS. Есть альтернативы (например, CoAP для IoT), но они не являются стандартом.
5. Встроенная безопасность (WS-Security)
Что это значит
WS-Security — стандарт для безопасности SOAP сообщений. Обеспечивает:
- Аутентификацию — кто отправил сообщение
- Подпись — сообщение не было изменено
- Шифрование — конфиденциальность
- Таймстемпы — защита от повторной отправки (replay attack)
Пример подписанного сообщения
<soap:Header>
<wsse:Security>
<ds:Signature>
<ds:SignedInfo>
<ds:Reference URI="#Body">
<ds:DigestValue>...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue>
</ds:Signature>
<wsse:UsernameToken>
<wsse:Username>ivan</wsse:Username>
<wsse:Password>***</wsse:Password>
</wsse:UsernameToken>
<wsu:Timestamp>
<wsu:Created>2024-01-15T10:30:00Z</wsu:Created>
<wsu:Expires>2024-01-15T10:35:00Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body id="Body">
<!-- Зашифрованное тело -->
<xenc:EncryptedData>...</xenc:EncryptedData>
</soap:Body>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Сквозная безопасность | Безопасность на уровне сообщения, не только транспорта |
| Подпись | Доказательство авторства и целостности |
| Шифрование | Даже если перехватили, не прочитают |
| Неотказуемость (non-repudiation) | Отправитель не может отрицать, что отправил сообщение |
REST аналогия
REST полагается на TLS/HTTPS для шифрования и аутентификации на транспортном уровне. Но TLS не даёт подписи сообщения и шифрования на уровне сообщения (приватно для разных получателей).
6. Надёжность (WS-ReliableMessaging)
Что это значит
WS-ReliableMessaging гарантирует доставку сообщений в распределённых системах даже при сбоях сети.
Возможности:
- Подтверждение получения (acknowledgement)
- Повторная отправка при потере
- Упорядочивание сообщений
- Устранение дубликатов
Пример заголовков надёжности
<soap:Header>
<wsrm:Sequence>
<wsrm:Identifier>http://example.com/rm/123</wsrm:Identifier>
<wsrm:MessageNumber>1</wsrm:MessageNumber>
<wsrm:LastMessage/>
</wsrm:Sequence>
<wsrm:Acknowledgement>
<wsrm:AcknowledgementRange Upper="5" Lower="1"/>
</wsrm:Acknowledgement>
</soap:Header>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Гарантированная доставка | Сообщение точно дойдёт |
| Упорядочивание | Сообщения обработаются в правильном порядке |
| Устранение дубликатов | Повторная отправка не создаст дубликат |
REST аналогия
REST не имеет встроенного механизма надёжности. Клиент сам должен реализовывать повторные попытки, идемпотентность, отслеживание порядка.
7. Распределённые транзакции (WS-AtomicTransaction)
Что это значит
WS-AtomicTransaction (WS-AT) позволяет выполнять распределённые транзакции, затрагивающие несколько SOAP сервисов, с гарантиями ACID.
Двухфазная фиксация (2PC):
- Фаза Prepare: Каждый участник проверяет, может ли он выполнить операцию
- Фаза Commit/Rollback: Если все готовы — commit, если нет — rollback
Пример заголовков транзакции
<soap:Header>
<wsat:AtomicTransaction>
<wsat:TransactionID>http://example.com/tx/123</wsat:TransactionID>
</wsat:AtomicTransaction>
</soap:Header>Почему это важно
| Преимущество | Объяснение |
|---|---|
| ACID гарантии | Атомарность, согласованность, изоляция, долговечность |
| Согласованность данных | Не может быть “половинчатого” состояния |
| Откат | Если один сервис упал, всё откатывается |
REST аналогия
REST не имеет встроенной поддержки распределённых транзакций. Для их реализации нужны сложные паттерны: Saga, компенсирующие транзакции, 2PC поверх HTTP.
8. Состояние (Stateful)
Что это значит
SOAP может быть stateful (с сохранением состояния). Сервер может запомнить контекст между вызовами.
<!-- Установка контекста -->
<soap:Header>
<myapp:SessionId>session-123</myapp:SessionId>
</soap:Header>Почему это важно
| Преимущество | Объяснение |
|---|---|
| Многошаговые операции | Можно разбить операцию на несколько вызовов |
| Экономия трафика | Не нужно передавать контекст в каждом запросе |
| Безопасность | Сессии можно отслеживать |
REST аналогия
REST stateless по принципу. Каждый запрос должен содержать всю необходимую информацию. Это упрощает масштабирование, но иногда требует передавать много данных в каждом запросе.
9. Многословность (Verbosity)
Что это значит
SOAP сообщения очень многословны. Одно и то же сообщение в SOAP может быть в 10-20 раз больше, чем в JSON.
Сравнение
SOAP (запрос пользователя):
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:user="http://example.com/user">
<soap:Body>
<user:GetUserRequest>
<user:UserId>123</user:UserId>
</user:GetUserRequest>
</soap:Body>
</soap:Envelope>Размер: ~300 байт
REST (тот же запрос):
GET /users/123Размер: ~20 байт
Почему это важно
| Аспект | Влияние |
|---|---|
| Сетевой трафик | SOAP потребляет больше带宽 |
| Время обработки | Парсинг XML тяжелее, чем JSON |
| Потребление памяти | XML документы занимают больше памяти |
10. Поддержка асинхронных операций
Что это значит
SOAP поддерживает несколько паттернов асинхронного взаимодействия.
Request-Response (синхронный):
Клиент → Запрос → Сервер → Ответ → КлиентCallback (асинхронный):
Клиент → Запрос (с callback адресом) → Сервер
Сервер → Ответ (на callback адрес) → КлиентPolling (асинхронный):
Клиент → Запрос → Сервер → "В обработке"
Клиент → Проверка статуса → Сервер → "Ещё не готов"
Клиент → Проверка статуса → Сервер → "Готов, вот ответ"Пример callback заголовка
<soap:Header>
<ws-addr:ReplyTo>
<ws-addr:Address>http://client.example.com/callback</ws-addr:Address>
</ws-addr:ReplyTo>
</soap:Header>Сводная таблица особенностей SOAP
| Особенность | Назначение | Есть в REST |
|---|---|---|
| Строгая типизация | Валидация, предсказуемость | Нет |
| WSDL | Формальный контракт, автогенерация | Опционально (OpenAPI) |
| SOAP Headers | Метаданные, расширяемость | Частично (HTTP headers) |
| Независимость от транспорта | HTTP, SMTP, JMS, TCP | Нет (почти всегда HTTP) |
| WS-Security | Подпись, шифрование, аутентификация | Частично (HTTPS + JWT) |
| WS-ReliableMessaging | Гарантированная доставка | Нет |
| WS-AtomicTransaction | Распределённые транзакции | Нет |
| Stateful | Сохранение контекста | Нет (stateless) |
| Асинхронность | Callback, polling | Частично (webhooks, polling) |
| Многословность | XML формат | Нет (JSON компактнее) |
Резюме для системного аналитика
Строгая типизация — каждое поле имеет явный тип. XML Schema валидирует сообщения до бизнес-логики.
WSDL — формальный контракт. Описывает всё, что нужно для вызова. Позволяет генерировать клиентский код автоматически.
SOAP Headers — отдельная секция для метаданных. Безопасность, транзакции, маршрутизация — в заголовках, не в теле.
Независимость от транспорта — SOAP работает через HTTP, SMTP, JMS, TCP. REST почти всегда HTTP.
WS-Security — безопасность на уровне сообщений. Подпись, шифрование, аутентификация. REST полагается на TLS.
WS-ReliableMessaging — гарантированная доставка, упорядочивание, устранение дубликатов.
WS-AtomicTransaction — распределённые транзакции с ACID гарантиями. Двухфазная фиксация.
Stateful — SOAP может сохранять состояние между вызовами. REST stateless.
Многословность — SOAP сообщения в 10-20 раз больше JSON. XML тяжелее парсить.