Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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
| Аспект | SOAP | REST |
|---|---|---|
| Формат | XML | JSON (обычно) |
| Транспорт | HTTP, SMTP, FTP | HTTP |
| Парадигма | 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
- Финансовые системы — банки, платёжные системы (интеграция с SWIFT, SEPA)
- Governmental services — налоговые, таможенные системы (XML-based)
- Enterprise PLC — SAP, Oracle, Microsoft (1С, Битрикс)
- Legacy системы — приложения 2000-х годов
- Высокая безопасность требуется — 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.