Что такое 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

ХарактеристикаSOAPREST
ФорматТолько XMLJSON, XML, другие
КонтрактОбязательный (WSDL)Опциональный (OpenAPI)
БезопасностьWS-Security (встроенная)HTTPS + пользовательская
Обработка ошибокSOAP FaultsHTTP-коды статуса
Кривая обученияВысокаяНизкая

Структура 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

  1. Импортировать WSDL: File > New SOAP Project
  2. SoapUI автоматически генерирует примеры запросов
  3. Изменить значения XML и отправить
  4. Добавить проверки (assertions) для валидации
  5. Создать наборы тестов и 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-атакаСсылки на внешние сущности должны быть заблокированы

Практическое упражнение

  1. Исследуйте публичный SOAP-сервис: Импортируйте WSDL в SoapUI или используйте cURL.
  2. Тестируйте через cURL: Отправьте SOAP-запрос и разберите XML-ответ.
  3. Тестирование ошибок: Отправьте некорректный XML и отсутствующие обязательные элементы.
  4. Сравните SOAP и REST: Если API предлагает оба интерфейса, сравните размер и сложность.

Ключевые выводы

  • SOAP использует XML-сообщения со строгой структурой Envelope/Header/Body и контракты WSDL
  • Хотя REST доминирует в новых API, SOAP остаётся критически важным в банках, здравоохранении и госсекторе
  • WSDL — полный контракт API, определяющий операции, сообщения, типы и endpoint-ы
  • SoapUI — отраслевой стандарт; cURL подходит для простых запросов
  • SOAP Faults — механизм ошибок: тестируйте коды fault, строки и элементы detail
  • XML-специфичные уязвимости (XXE, XML-инъекция) нужно тестировать отдельно