Web & API

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-сервер