Конверт SOAP
SOAP (от англ. Simple Object Access Protocol — простой протокол доступа к объектам) — это протокол обмена структурированными сообщениями в распределённой вычислительной среде, основанный на языке XML. Первоначально SOAP был разработан для вызова удалённых процедур (RPC) поверх сетевых протоколов, таких как HTTP и SMTP, однако со временем его применение расширилось на передачу произвольных данных в сервис-ориентированной архитектуре (SOA) и веб-сервисах. Формат сообщения SOAP, называемый «конвертом», является фундаментальной единицей этого протокола, жёстко регламентирующей структуру передаваемого XML-документа.
История
Протокол SOAP был создан в 1998 году в компании Microsoft. Первая спецификация (SOAP 1.0) была предложена в декабре 1999 года, а версия 1.1, разработанная совместно Microsoft, DevelopMentor и UserLand Software, стала официальным документом в 2000 году. В 2003 году W3C (Консорциум Всемирной паутины) выпустил рекомендацию SOAP 1.2, которая существенно изменила идеологию протокола: он перестал быть исключительно протоколом для RPC, превратившись в универсальный механизм обмена сообщениями. В версии 1.2 также был официально введён термин «конверт» (англ. envelope) как центральный элемент обработки сообщений.
С 2013 года интерес к SOAP начал снижаться в пользу более лёгких RESTful-сервисов, но протокол по-прежнему широко используется в корпоративных системах, финансовых и государственных информационных системах, где требуется строгая типизация и гарантии доставки сообщений.
Структура сообщения
Любое сообщение SOAP представляет собой строго структурированный XML-документ, который обязательно содержит три основных элемента:
- Конверт (Envelope) — корневой элемент, который идентифицирует документ как сообщение SOAP. Атрибуты конверта задают пространства имён (namespace) и версию протокола.
- Заголовок (Header) — необязательный элемент, содержащий метаданные об сообщении: маршрутизацию, аутентификацию, транзакции, цифровые подписи и прочие управляющие данные.
- Тело (Body) — обязательный элемент, в котором передаются собственно данные вызова или ответа (например, параметры удалённой процедуры или результаты выполнения).
Пример простейшего конверта SOAP: ``xml <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <t:Transaction xmlns:t="http://example.com/transaction">12345</t:Transaction> </soap:Header> <soap:Body> <AddRequest xmlns="http://example.com/calc"> <OperandA>5</OperandA> <OperandB>3</OperandB> </AddRequest> </soap:Body> </soap:Envelope> ``
Правила структуры
- Конверт должен быть единственным корневым элементом XML-документа.
- Все элементы внутри конверта имеют строгую иерархию: заголовок (если есть) следует за конвертом, а тело — после заголовка.
- Имена собственных дочерних элементов (например,
<Header>,<Body>) зарезервированы и не могут быть изменены пользователем. - Атрибут
encodingStyleв конверте задаёт способ сериализации данных (обычно это SOAP Encoding). - Фата (Fault) — особый элемент, который может быть вложен в Body для сообщения об ошибках.
Обработка конверта
Каждый конверт SOAP обрабатывается стеком протоколов (SOAP Processor), который включает следующие шаги:
- Парсинг XML — конверт читается как обычный XML-документ.
- Проверка структуры — верифицируется корректность вложенности, пространств имён и наличие обязательных блоков.
- Обработка заголовка — модули (например, для проверки подписи или маршрутизации) извлекают элементы заголовка и применяют соответствующие политики.
- Обработка тела — данные тела извлекаются и передаются на уровень бизнес-логики (веб-сервиса).
- Формирование ответа — результат (или ошибка) упаковывается в новый конверт SOAP и отправляется обратно.
Версии
В настоящее время используются две основные версии SOAP: 1.1 и 1.2. Они различаются пространствами имён и некоторыми правилами обработки:
- SOAP 1.1 использует пространство имён
http://schemas.xmlsoap.org/soap/envelope/`. Широко распространена в старых корпоративных системах. - SOAP 1.2 использует
http://www.w3.org/2003/05/soap-envelope`. Является официальной рекомендацией W3C и предлагает улучшенную обработку ошибок и поддержку новых типов данных.
Версия 1.2 ввела понятие «конверт без заголовка» (только Envelope и Body) как допустимый вариант, что упрощает совместимость. Кроме того, в 1.2 переопределён элемент Fault: теперь он содержит обязательный код ошибки (Code), подкод (Subcode) и детали (Detail).
Применение конверта SOAP
Основное применение конверта SOAP — это инкапсуляция вызовов веб-сервисов в протоколах транспортного уровня. Наиболее часто используется поверх HTTP, поскольку конверт SOAP может без проблем передаваться в теле HTTP-запроса (POST) или ответа (200 OK). Однако возможна передача через SMTP (электронная почта), JMS (Java Message Service) и другие протоколы.
Примеры использования в России
- В российской государственной системе межведомственного электронного взаимодействия (СМЭВ) для передачи запросов используется SOAP с привязкой к HTTP. Конверты содержат метаданные о поставщике услуги (СНИЛС, ИНН) и подписываются электронной цифровой подписью.
- В платформе «Госуслуги» для обмена данными с ведомствами (например, получение сведений из ФНС) применяются SOAP-сообщения, упакованные в TLS-туннель.
- Многие ERP-системы (1С, SAP) при интеграции с внешними сервисами также используют конверты SOAP для вызова удалённых процедур.
Обработка ошибок
Если при обработке конверта возникает проблема, веб-сервис возвращает ответ, содержащий элемент Fault в теле. Стандартный элемент Fault (SOAP 1.2) включает:
- Code — код ошибки (например,
env:Senderпри некорректных данных отправителя,env:Receiverпри внутренней ошибке сервера). - Reason — текстовое описание на выбранном языке.
- Detail — дополнительные сведения (например, стектрейс).
Пример Fault: ``xml <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Body> <soap:Fault> <soap:Code> <soap:Value>soap:Sender</soap:Value> </soap:Code> <soap:Reason> <soap:Text xml:lang="ru">Неверный идентификатор операции</soap:Text> </soap:Reason> </soap:Fault> </soap:Body> </soap:Envelope> ``
Критика и ограничения
Конверт SOAP часто критикуется за избыточность и сложность по сравнению с альтернативами (REST/JSON). Основные недостатки:
- Большой объём сообщений — из-за обязательного XML-конверта и заголовков даже простая команда занимает от нескольких сотен байт.
- Сложность отладки — трудоёмкость трассировки взаимодействий из-за множества вложенных пространств имён.
- Порог входа — требуется понимание WSDL (Web Services Description Language), пространств имён и схем XML.
В то же время для систем, где критична проверяемость схемы, строгая типизация и безопасность (финансовые транзакции, государственные реестры), конверт SOAP остаётся де-факто стандартом. В России, при создании ведомственных систем, ориентированных на СМЭВ, SOAP сохраняет доминирующее положение.
Связь с другими протоколами
- REST — альтернативный подход, где данные передаются в форматах JSON, XML или plain text без конверта. Проще, быстрее, но не гарантирует строгой структуры.
- XML-RPC — прямой предшественник SOAP, не использующий конверт, а только тело с вызовом процедуры.
- WSDL — язык описания веб-сервисов, который определяет структуру конвертов SOAP для конкретного сервиса.
Источники
- W3C: SOAP Version 1.2 Part 1: Messaging Framework (Second Edition), 2007.
- W3C: SOAP Version 1.1, 2000.
- «XML: Спецификация SOAP 1.2» — перевод руководства W3C, 2004.
- «Веб-сервисы и SOAP» — учебник для вузов под редакцией А. Б. Долгих, 2005.
- Книга «Java Web Services: Up and Running» М. Калински, O’Reilly, 2009.
- Документация СМЭВ — Методические рекомендации по разработке электронных сервисов с использованием SOAP, Минцифры России, 2018.
- Статья «SOAP vs REST: что выбрать» — журнал «Системный администратор», №5, 2020.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →