Если ты — начинающий системный аналитик или просто интересуешься сферой системного анализа, то эта статья для тебя.

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


Что такое SOAP и WSDL и почему они важны

SOAP и WSDL — это классические технологии интеграции «системы-система» (в основном в enterprise), которые системный аналитик часто видит в требованиях, интеграционных схемах и при описании API. Их используют при построении интеграции между системами, где важна строгость, формализация и надёжность.

SOAP — протокол обмена сообщениями между системами, обычно поверх HTTP, где данные и “конверт” сообщения оформлены в XML.

Он задает формат запросов и ответов, структуру сообщений (header / body), типовые ошибки, а также поддерживает корпоративные требования вроде строгих контрактов и расширений.

WSDL — это язык описания, как паспорт SOAP-сервиса: XML-описание, какие операции есть; какие сообщения и типы данных используются, куда и как отправлять запросы.

Это формальная спецификация интерфейса, по которой разработчики и интеграционные шины могут генерировать клиент / серверный код и валидировать соответствие.

Вместе эти средства позволяют достичь трех целей:

  1. Чётко определить структуру сообщений и интерфейсы сервисов;

  2. Упростить интеграцию между системами;

  3. Обеспечить надёжный обмен данными.

Структура 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 и схемы: любые ломающие изменения делай только через новую версию и поддерживай старую параллельно какое-то время, а мелкие правки делай так, чтобы текущие пользователи могли продолжать работу.

Сразу договорись с обеими сторонам интеграции, как сервис будет сообщать об ошибках, чтобы их можно было быстро отличать и фиксить. Отдельно опиши признаки кривого запроса (не хватает обязательных полей, неверный тип или формат — такое должно отсеиваться сразу), и случаи, когда запрос правильный, но по смыслу выполнить его нельзя (например, “заказ не найден” или “недостаточно прав”). И зафиксируй, какие именно коды и тексты ошибок возвращаются, чтобы по ним и по логам сразу было понятно, где проблема — в формате запроса, в данных или на стороне сервиса.


Это далеко не все советы, которые мы могли бы дать, но растягивать эту статью нет смысла. Спасибо за внимание!

Комментарии (0)