SOAP
Протокол обмена сообщениями в формате XML со строгим контрактом WSDL — старший родственник REST, до сих пор живущий в банках и госсистемах.
Что такое SOAP
SOAP (Simple Object Access Protocol) — протокол обмена структурированными сообщениями между приложениями. Сообщение всегда XML-документ строго заданной формы, а весь контракт сервиса описан машиночитаемым файлом WSDL.
В отличие от REST, SOAP — именно протокол, а не архитектурный стиль: он жёстко задаёт формат конверта, обработку ошибок и расширения. Транспортом обычно служит HTTP, но в теории подойдёт и очередь сообщений, и SMTP — SOAP от транспорта не зависит.
Название исторически расшифровывалось как Simple Object Access Protocol; начиная с версии 1.2 расшифровку официально отменили — от «simple» в спецификации к тому моменту осталось немного.
Как выглядит сообщение
Любой вызов — это POST на единственный эндпоинт с XML-конвертом:
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header>
<auth:Token xmlns:auth="urn:example:auth">a1b2c3</auth:Token>
</soap:Header>
<soap:Body>
<GetBalance xmlns="urn:example:billing">
<AccountId>40817810099910004312</AccountId>
</GetBalance>
</soap:Body>
</soap:Envelope>
Структура всегда одна: Envelope (конверт) содержит необязательный Header (аутентификация, транзакции, маршрутизация) и обязательный Body (сам вызов). Ошибка приходит внутри Body как элемент Fault — с кодом и текстом.
curl -X POST https://api.example.com/billing \
-H "Content-Type: application/soap+xml; charset=utf-8" \
--data-binary @request.xml
Ключевое отличие от REST на уровне ощущений: адрес один на весь сервис, метод всегда POST, а что именно вызывается — написано внутри XML. Поэтому код ответа HTTP почти ничего не говорит: сервис может вернуть 200 OK с Fault-ошибкой внутри тела.
WSDL — контракт сервиса
WSDL (Web Services Description Language) — XML-файл, описывающий все операции сервиса, типы данных и адрес. Роль та же, что у OpenAPI в мире REST, но с одним отличием: в SOAP контракт обязателен и появился сразу, а не был добавлен позже.
По WSDL инструменты генерируют готового клиента — обращение к чужому сервису превращается в вызов метода:
from zeep import Client
client = Client("https://api.example.com/billing?wsdl")
print(client.service.GetBalance(AccountId="40817810099910004312"))
Из-за строгой типизации и кодогенерации SOAP-интеграция редко ломается молча: расхождение схем всплывает сразу.
SOAP или REST
| SOAP | REST | |
|---|---|---|
| Что это | протокол | архитектурный стиль |
| Формат | только XML | обычно JSON |
| Контракт | WSDL, обязателен | OpenAPI, по желанию |
| Эндпоинты | один на сервис | много, по ресурсам |
| Методы HTTP | только POST | GET, POST, PUT, DELETE |
| Ошибки | Fault внутри тела | коды состояния HTTP |
| Безопасность | WS-Security на уровне сообщения | TLS + JWT или OAuth |
| Объём трафика | большой | компактный |
| Из браузера | практически нет | штатно |
Для нового публичного API SOAP сегодня не берут: XML многословен, порог входа выше, а из фронтенда его звать неудобно. Но там, где нужны подпись отдельного сообщения, гарантии доставки и распределённые транзакции, WS-* стек до сих пор закрывает вопросы, которые в REST решаются самодельно.
Где встречается сегодня
SOAP — не мёртвый протокол, а legacy, с которым приходится интегрироваться: банковские и платёжные шлюзы, страховые и телеком-биллинги, обмен с 1С, корпоративные шины (ESB), государственные системы вроде СМЭВ. Выбора обычно нет: чужая сторона диктует протокол, и клиент пишется под её WSDL.
Типичный компромисс — прослойка: сервис-адаптер ходит в SOAP-систему, а наружу отдаёт нормальный JSON-API. Тогда XML остаётся в одном месте, а не расползается по всем микросервисам.
Связанные термины
- API — общий контекст интеграций
- REST API — стиль, вытеснивший SOAP из веба
- gRPC — современный ответ на ту же задачу строгого контракта
- HTTP — обычный транспорт для SOAP
- Swagger / OpenAPI — аналог WSDL для REST
Готовы запустить GPU-задачу?
Запустить GPU-сервер