Если ты — начинающий системный аналитик или просто интересуешься сферой системного анализа, то эта статья для тебя.
Пройдемся по верхам SOAP и WSDL — технологий, которые превращают хаос интеграции в порядок, а идеи — в готовые решения. С их помощью создаются надежные и совместимые веб-сервисы, налаживается бесперебойный обмен данными между системами вне зависимости от платформы — и другие чудеса.

Что такое SOAP и WSDL и почему они важны
SOAP и WSDL — это классические технологии интеграции «системы-система» (в основном в enterprise), которые системный аналитик часто видит в требованиях, интеграционных схемах и при описании API. Их используют при построении интеграции между системами, где важна строгость, формализация и надёжность.
SOAP — протокол обмена сообщениями между системами, обычно поверх HTTP, где данные и “конверт” сообщения оформлены в XML.
Он задает формат запросов и ответов, структуру сообщений (header / body), типовые ошибки, а также поддерживает корпоративные требования вроде строгих контрактов и расширений.
WSDL — это язык описания, как паспорт SOAP-сервиса: XML-описание, какие операции есть; какие сообщения и типы данных используются, куда и как отправлять запросы.
Это формальная спецификация интерфейса, по которой разработчики и интеграционные шины могут генерировать клиент / серверный код и валидировать соответствие.
Вместе эти средства позволяют достичь трех целей:
Чётко определить структуру сообщений и интерфейсы сервисов;
Упростить интеграцию между системами;
Обеспечить надёжный обмен данными.
Структура SOAP и WSDL
SOAP и WSDL обычно идут в паре: SOAP задает, как выглядит само сообщение, а WSDL описывает, какие операции сервис поддерживает и какие сообщения он ждет и возвращает.
Здесь разберем структуру на составные части.
Элементы SOAP. Это элементы сообщения, из которых складывается любой запрос или ответ.
Envelope — корневой элемент, определяющий границы сообщения;
Header — необязательный блок для передачи метаданных;
Body — основное содержимое сообщения;
Fault — блок для описания ошибок.
Элементы WSDL. Это элементы документа, который фиксирует контракт интеграции.
Types — определения используемых типов данных;
Message — описание входных и выходных сообщений;
PortType — перечень операций сервиса;
Binding — привязка операций к протоколу передачи;
Service — описание доступности сервиса.
Все эти элементы существуют для того, чтобы быстро понимать, где в SOAP лежат данные и ошибки, а где в WSDL искать описание операций, типов и адресов вызова.
Пример использования SOAP и WSDL в корпоративной системе
Предположим, вы разрабатываете систему для получения курса валют. Покажем пример реализации, чтобы вы на примере увидели, с чем мы работаем.
SOAP-запрос:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Body> <getCurrencyRate xmlns="http://example.com/finance"> <currency>USD</currency> </getCurrencyRate> </soap:Body> </soap:Envelope>
Фрагмент WSDL-документа:
<definitions name="FinanceService" targetNamespace="http://example.com/finance" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema> <xsd:element name="getCurrencyRate" type="xsd:string"/> </xsd:schema> </types> <message name="GetCurrencyRateRequest"> <part name="currency" type="xsd:string"/> </message> <message name="GetCurrencyRateResponse"> <part name="rate" type="xsd:float"/> </message> <portType name="FinancePortType"> <operation name="getCurrencyRate"> <input message="tns:GetCurrencyRateRequest"/> <output message="tns:GetCurrencyRateResponse"/> </operation> </portType> <binding name="FinanceSoapBinding" type="tns:FinancePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getCurrencyRate"> <soap:operation soapAction="http://example.com/finance/getCurrencyRate"/> <input> <soap:body use="encoded" namespace="http://example.com/finance" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="encoded" namespace="http://example.com/finance" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <service name="FinanceService"> <port name="FinancePort" binding="tns:FinanceSoapBinding"> <soap:address location="http://example.com/finance"/> </port> </service> </definitions>
Несколько советов по использованию SOAP и WSDL на практике
Имеет смысл использовать SOAP, когда ты встраиваешься в существующую корпоративную среду, где уже принято жить по жестким правилам интеграций, и где вокруг много старых систем. Также если есть требования по безопасности на уровне сообщений, аудиту, формальным схемам (WSDL/XSD), интеграция через ESB.
Откажись от SOAP, если это новый публичный API без особых требований: лучше зайдет REST / JSON, т.к. SOAP имеет больше накладных расходов (XML, схемы, строгие правила).
Если SOAP все-таки нужен, относись к WSDL как к официальной инструкции для интеграции: в нем описано, какие операции вообще доступны, какие данные нужно передавать и что придет в ответ. Практически это значит, что ты не выдумываешь формат сам и не опираешься на переписку, а берешь WSDL/XSD и прямо по ним проверяешь: правильный ли метод вызывается, все ли обязательные поля на месте, не перепутаны ли типы и форматы.
Чем раньше ты находишь такие ошибки на тестах, тем меньше сюрпризов всплывает при интеграции.
Чтобы интеграция не развалилась через пару месяцев, зафиксируй правила с теми людьми, которые делают и принимают интеграцию, как будут меняться WSDL и схемы: любые ломающие изменения делай только через новую версию и поддерживай старую параллельно какое-то время, а мелкие правки делай так, чтобы текущие пользователи могли продолжать работу.
Сразу договорись с обеими сторонам интеграции, как сервис будет сообщать об ошибках, чтобы их можно было быстро отличать и фиксить. Отдельно опиши признаки кривого запроса (не хватает обязательных полей, неверный тип или формат — такое должно отсеиваться сразу), и случаи, когда запрос правильный, но по смыслу выполнить его нельзя (например, “заказ не найден” или “недостаточно прав”). И зафиксируй, какие именно коды и тексты ошибок возвращаются, чтобы по ним и по логам сразу было понятно, где проблема — в формате запроса, в данных или на стороне сервиса.
Это далеко не все советы, которые мы могли бы дать, но растягивать эту статью нет смысла. Спасибо за внимание!