Протокол SOAP
SOAP (от англ. Simple Object Access Protocol — простой протокол доступа к объектам) — это протокол прикладного уровня, предназначенный для обмена структурированными сообщениями в распределённой вычислительной среде. SOAP использует язык разметки XML для форматирования сообщений и может работать поверх различных транспортных протоколов, наиболее часто — поверх HTTP и HTTPS. Протокол определяет формат сообщения, правила его обработки, а также набор соглашений для реализации удалённого вызова процедур (RPC) и обмена данными между веб-службами.
История
Протокол SOAP был разработан компаниями Microsoft, DevelopMentor и UserLand Software. Первая версия спецификации (SOAP 0.9) была опубликована в сентябре 1999 года. В 2000 году вышла версия 1.1, которая была передана на рассмотрение в Консорциум Всемирной паутины (W3C). После длительного процесса стандартизации в 2003 году была опубликована версия 1.2, которая стала официальным рекомендацией W3C. В 2007 году вышла вторая редакция этой версии, которая остаётся актуальной на 2025 год.
Изначально протокол назывался Simple Object Access Protocol, однако начиная с версии 1.2 официальное название было сокращено до просто «SOAP», поскольку первоначальная аббревиатура перестала отражать суть протокола — он вышел за рамки «простого» и перестал быть привязанным исключительно к объектной модели.
Архитектура и принципы работы
SOAP основан на модели «запрос-ответ», хотя поддерживает и однонаправленную передачу сообщений. Сообщение SOAP представляет собой XML-документ, который состоит из следующих элементов:
- Конверт (Envelope) — корневой элемент, который определяет начало и конец сообщения. Обязателен для любого SOAP-сообщения.
- Заголовок (Header) — необязательный элемент, содержащий метаданные: информацию об аутентификации, маршрутизации, транзакциях, обработке ошибок. Заголовок может содержать несколько блоков, каждый из которых может быть помечен атрибутами
mustUnderstand(обязательность обработки),actor(целевой получатель) иencodingStyle(стиль кодирования). - Тело (Body) — обязательный элемент, содержащий собственно данные запроса или ответа. В случае ошибки в теле размещается элемент
Fault, описывающий сбой. - Ошибка (Fault) — специальный элемент в теле, используемый для передачи информации об ошибках. Содержит код ошибки (
faultcode), описание (faultstring), детали (detail) и, опционально, роль узла (faultactor).
Транспортные протоколы
Хотя SOAP не привязан к какому-либо конкретному транспортному протоколу, наиболее распространённым является использование HTTP. При этом SOAP-сообщение передаётся в теле HTTP-запроса (обычно POST), а заголовки HTTP используются для указания типа содержимого (Content-Type: text/xml для SOAP 1.1 или application/soap+xml для SOAP 1.2). Также возможно использование SMTP, JMS, TCP и других протоколов.
Привязки (Bindings)
SOAP определяет набор правил для использования с различными транспортными протоколами, называемых привязками. Наиболее известны:
- SOAP HTTP Binding — стандартная привязка для HTTP.
- SOAP SMTP Binding — для электронной почты.
- SOAP JMS Binding — для очередей сообщений Java Message Service.
Версии протокола
Существует две основные версии SOAP, которые не полностью совместимы между собой:
SOAP 1.1
- Использует пространство имён
http://schemas.xmlsoap.org/soap/envelope/`. - Тип содержимого —
text/xml. - Обработка ошибок через элемент
Faultс четырьмя подэлементами. - Не поддерживает некоторые расширенные возможности, добавленные в версии 1.2.
SOAP 1.2
- Использует пространство имён
http://www.w3.org/2003/05/soap-envelope`. - Тип содержимого —
application/soap+xml. - Уточнена модель обработки заголовков и ошибок.
- Введены новые коды ошибок (
DataEncodingUnknown,MustUnderstand,Sender,Receiver). - Добавлена поддержка протокола HTTP 1.1 с использованием методов GET и POST.
- Улучшена поддержка промежуточных узлов (intermediaries).
Стиль сообщений и использование
SOAP поддерживает два основных стиля взаимодействия:
RPC-стиль (Remote Procedure Call)
Сообщение строится как вызов метода с параметрами. Имя метода и параметры кодируются в теле сообщения. Этот стиль был популярен в ранних реализациях, но сейчас используется реже из-за жёсткой привязки к конкретным сигнатурам методов.
Document-стиль (Документный)
Сообщение содержит произвольный XML-документ, структура которого определяется схемой (XSD). Этот стиль более гибок и позволяет передавать сложные структуры данных. Он стал стандартом для современных веб-служб.
Кроме того, различают два режима кодирования:
- Encoded — данные кодируются по правилам, определённым в спецификации SOAP (используется в RPC-стиле).
- Literal — данные передаются в точном соответствии с XML-схемой (используется в Document-стиле).
WSDL и SOAP
Для описания веб-служб, использующих SOAP, применяется язык WSDL (Web Services Description Language). WSDL-документ определяет:
- Типы данных (с использованием XSD).
- Сообщения (входные и выходные).
- Операции (методы).
- Привязки (как SOAP-сообщение будет передаваться по сети).
- Адрес конечной точки (endpoint).
WSDL позволяет автоматически генерировать клиентский код для различных языков программирования.
Преимущества и недостатки
Преимущества
- Платформонезависимость — SOAP работает с любым языком программирования и операционной системой.
- Расширяемость — через заголовки можно добавлять любые метаданные (безопасность, транзакции, маршрутизация).
- Стандартизация — протокол является рекомендацией W3C, что обеспечивает совместимость реализаций.
- Поддержка сложных сценариев — транзакции, асинхронная обработка, маршрутизация через промежуточные узлы.
- Встроенная обработка ошибок — элемент Fault предоставляет структурированную информацию об ошибках.
Недостатки
- Избыточность — XML-формат приводит к большому объёму сообщений по сравнению с JSON или бинарными протоколами.
- Сложность — протокол требует значительных вычислительных ресурсов для разбора XML и реализации всей спецификации.
- Низкая скорость — из-за объёма данных и необходимости парсинга XML производительность ниже, чем у более лёгких протоколов (например, REST с JSON).
- Сложность отладки — XML-сообщения трудно читать и отлаживать без специальных инструментов.
- Меньшая популярность — с середины 2010-х годов REST и gRPC вытеснили SOAP из многих областей, особенно в веб-разработке.
Применение
Несмотря на снижение популярности, SOAP продолжает использоваться в следующих областях:
- Корпоративные системы — в банковской сфере, страховании, телекоммуникациях, где требуется строгая стандартизация и поддержка транзакций.
- Унаследованные системы (legacy) — многие старые веб-службы до сих пор работают на SOAP.
- Интеграция с Microsoft .NET — платформа .NET имеет встроенную поддержку SOAP (Windows Communication Foundation).
- Стандарты безопасности — протоколы WS-Security, WS-Trust, WS-Federation построены на основе SOAP.
- Системы электронного документооборота — например, в России протокол SOAP используется в системе межведомственного электронного взаимодействия (СМЭВ).
Пример SOAP-сообщения
Ниже приведён пример SOAP-запроса (версия 1.1) для получения курса валюты:
``xml <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.example.com/currency"> <soap:Header/> <soap:Body> <web:GetCurrencyRate> <web:CurrencyCode>USD</web:CurrencyCode> </web:GetCurrencyRate> </soap:Body> </soap:Envelope> ``
Пример ответа с ошибкой:
``xml <?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>Currency code not found</faultstring> <detail> <error>Invalid currency code: USDX</error> </detail> </soap:Fault> </soap:Body> </soap:Envelope> ``
Критика и альтернативы
Основная критика SOAP связана с его сложностью и избыточностью. В современной веб-разработке предпочтение отдаётся REST (Representational State Transfer), который использует JSON и HTTP-методы (GET, POST, PUT, DELETE) для более простого и быстрого взаимодействия. Также набирает популярность gRPC, использующий бинарный протокол Protobuf и обеспечивающий высокую производительность.
Тем не менее, SOAP остаётся востребованным в сценариях, где критичны строгая типизация, поддержка сложных транзакций, безопасность на уровне сообщений и совместимость с унаследованными системами.
Источники
- W3C Recommendation: SOAP Version 1.2 Part 1: Messaging Framework (Second Edition), 2007.
- W3C Note: SOAP Version 1.1, 2000.
- Box, D., Ehnebuske, D., Kakivaya, G., Layman, A., Mendelsohn, N., Nielsen, H.F., Thatte, S., Winer, D. «Simple Object Access Protocol (SOAP) 1.1», 2000.
- Snell, J., Tidwell, D., Kulchenko, P. «Programming Web Services with SOAP», O'Reilly Media, 2002.
- Weerawarana, S., Curbera, F., Leymann, F., Storey, T., Ferguson, D.F. «Web Services Platform Architecture: SOAP, WSDL, WS-Policy, WS-Addressing, WS-BPEL, and More», Prentice Hall, 2005.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →