Что такое SOAP?
SOAP (Simple Object Access Protocol) — протокол обмена сообщениями для передачи структурированных данных. Использует XML для форматирования сообщений и обычно работает поверх HTTP, хотя может использовать другие протоколы (SMTP и др.).
SOAP доминировал до появления REST. Хотя новые API используют REST или GraphQL, SOAP остаётся критически важным в enterprise-среде.
Где SOAP по-прежнему используется
- Банки и финансы — обработка платежей, межбанковская связь
- Здравоохранение — интеграции HL7/FHIR, страховые претензии
- Госсектор — подача налоговых деклараций, регуляторная отчётность
- Enterprise — SAP, Salesforce SOAP API, legacy CRM/ERP
- Телекоммуникации — провижининг, биллинг
SOAP vs. REST
| Характеристика | SOAP | REST |
|---|---|---|
| Формат | Только XML | JSON, XML, другие |
| Контракт | Обязательный (WSDL) | Опциональный (OpenAPI) |
| Безопасность | WS-Security (встроенная) | HTTPS + пользовательская |
| Обработка ошибок | SOAP Faults | HTTP-коды статуса |
| Кривая обучения | Высокая | Низкая |
Структура SOAP-сообщения
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:usr="http://example.com/users">
<soap:Header>
<usr:AuthToken>token123</usr:AuthToken>
</soap:Header>
<soap:Body>
<usr:GetUser>
<usr:userId>42</usr:userId>
</usr:GetUser>
</soap:Body>
</soap:Envelope>
SOAP Faults (ответы об ошибках)
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Пользователь не найден</faultstring>
<detail>
<errorCode>USER_404</errorCode>
</detail>
</soap:Fault>
WSDL — контракт
WSDL определяет всё о SOAP-сервисе: типы, сообщения, операции, привязки и endpoint-ы.
https://api.example.com/UserService?wsdl
Тестирование SOAP-сервисов
Использование SoapUI
- Импортировать WSDL: File > New SOAP Project
- SoapUI автоматически генерирует примеры запросов
- Изменить значения XML и отправить
- Добавить проверки (assertions) для валидации
- Создать наборы тестов и data-driven тесты
Использование cURL
curl -X POST \
-H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: http://example.com/GetUser" \
-d '<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetUser xmlns="http://example.com/users">
<userId>42</userId>
</GetUser>
</soap:Body>
</soap:Envelope>' \
https://api.example.com/UserService
Тестовые сценарии SOAP
| Категория | Тесты |
|---|---|
| Функциональные | Валидные запросы для каждой операции |
| Валидация | Отсутствующие элементы, неверные типы, невалидный XML |
| Безопасность | WS-Security, просроченные токены, SQL/XML-инъекции |
| Faults | Коды fault, строки и элементы detail |
| Соответствие WSDL | Ответ соответствует схеме WSDL |
| Производительность | Время ответа под нагрузкой |
Тесты валидации XML
| Тест | Ожидание |
|---|---|
| Правильно сформированный XML | Незакрытые теги должны вызвать ошибку |
| Валидация схемы | Элементы должны соответствовать типам WSDL |
| Ошибки namespace | Неверный namespace возвращает fault |
| Пустые обязательные элементы | Возвращает fault валидации |
| XML-инъекция | Теги <script> должны быть экранированы/отклонены |
| XXE-атака | Ссылки на внешние сущности должны быть заблокированы |
Практическое упражнение
- Исследуйте публичный SOAP-сервис: Импортируйте WSDL в SoapUI или используйте cURL.
- Тестируйте через cURL: Отправьте SOAP-запрос и разберите XML-ответ.
- Тестирование ошибок: Отправьте некорректный XML и отсутствующие обязательные элементы.
- Сравните SOAP и REST: Если API предлагает оба интерфейса, сравните размер и сложность.
Ключевые выводы
- SOAP использует XML-сообщения со строгой структурой Envelope/Header/Body и контракты WSDL
- Хотя REST доминирует в новых API, SOAP остаётся критически важным в банках, здравоохранении и госсекторе
- WSDL — полный контракт API, определяющий операции, сообщения, типы и endpoint-ы
- SoapUI — отраслевой стандарт; cURL подходит для простых запросов
- SOAP Faults — механизм ошибок: тестируйте коды fault, строки и элементы detail
- XML-специфичные уязвимости (XXE, XML-инъекция) нужно тестировать отдельно