SOAP-клиент: WSDL, envelope и SOAPAction

SOAP-пространство PolyApiIDE принимает WSDL, собирает конверт запроса и показывает Fault так, чтобы было понятно, где именно разошлись схема и тело.

SOAP жив там, где живут корпоративные и государственные интеграции: обмен с ведомствами, банковские шлюзы, унаследованные ESB. Формат придирчив к деталям — один неверный Content-Type или пустой SOAPAction, и сервис отвечает Fault вместо данных.

Поэтому SOAP в PolyApiIDE сделан как отдельный тип пространства: WSDL импортируется, операции видны списком, а окружения хранят адреса контуров и реквизиты доступа.

Из чего состоит SOAP-запрос

Это HTTP POST с XML-телом. В теле — конверт Envelope, внутри него необязательный Header и обязательный Body с вызовом операции. Версия SOAP определяет и пространство имён конверта, и транспортные заголовки.

В SOAP 1.1 используется namespace http://schemas.xmlsoap.org/soap/envelope/, Content-Type: text/xml; charset=utf-8 и отдельный заголовок SOAPAction — его значение берётся из soapAction в binding-секции WSDL и в кавычках. В SOAP 1.2 namespace другой — http://www.w3.org/2003/05/soap-envelope, тип application/soap+xml; charset=utf-8, а действие передаётся параметром action внутри Content-Type, а не отдельным заголовком. Половина загадочных отказов объясняется именно путаницей между этими двумя наборами.

Как отправить SOAP-запрос

1. Импортируйте WSDL

Импорт WSDL входит в бесплатный тариф. Из описания берутся адрес сервиса, список операций и значения SOAPAction — это снимает львиную долю ручной работы и опечаток.

2. Выберите операцию и соберите конверт

Тело строится по схеме из WSDL. Следите за префиксами пространств имён и порядком элементов: в XML Schema порядок внутри sequence значим, и перестановка полей — такая же ошибка, как пропуск обязательного элемента.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns:GetBalance xmlns:ns="urn:example:billing">
      <ns:account>{{account}}</ns:account>
    </ns:GetBalance>
  </soap:Body>
</soap:Envelope>

3. Проверьте заголовки

Для SOAP 1.1 нужны Content-Type: text/xml; charset=utf-8 и непустой SOAPAction. Для SOAP 1.2 — application/soap+xml; charset=utf-8 с параметром action. Версию берите из WSDL, а не угадывайте.

4. Подставьте значения из окружения

Адрес контура, логин, номера счетов и идентификаторы запроса держите в окружении и подставляйте через {{var}} — подстановка работает и в XML-теле. Так один запрос ходит и в тест, и в прод без правки конверта.

5. Разберите ответ или Fault

Ошибка SOAP приходит конвертом с элементом Fault, обычно при HTTP-коде 500. В версии 1.1 смотрите faultcode и faultstring, в 1.2 — Code/Value и Reason/Text. Значение soap:Client (в 1.2 — soap:Sender) означает, что виноват запрос, soap:Server — что сломалось на стороне сервиса.

Типичные ошибки и что проверить

СимптомВероятная причинаЧто сделать
HTTP 415 Сервер ждёт другой Content-Type text/xml для SOAP 1.1, application/soap+xml для 1.2
Fault про SOAPAction Заголовок пустой или не тот Взять значение soapAction из binding в WSDL, в 1.1 — в кавычках
Fault с faultcode soap:Client Тело не прошло проверку по схеме Обязательные элементы, порядок внутри sequence, типы значений
Fault про unexpected element Неверный namespace или префикс Сверить targetNamespace операции с конвертом
HTTP 200 с пустым Body Односторонняя операция Проверить, что по WSDL ответ вообще предусмотрен
HTTP 401 или 403 Отказ на шлюзе, до сервиса не дошло Реквизиты доступа, сертификат канала, белый список адресов

Государственные и корпоративные сервисы

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

Чего оно не делает — и это важно сказать до установки: расширение не формирует электронную подпись и не собирает MTOM-вложения. Если регламент требует подписанный XML, конверт подписывается внешним средством, а в клиент попадает уже готовое тело. Для задач интеграции с ведомственными сервисами у нас есть отдельная страница.

Частые вопросы

Нужен ли аккаунт и платный тариф?

Нет. Импорт WSDL и отправка SOAP-запросов доступны на Free, регистрация на сайте для этого не нужна. Платные тарифы нужны для сценариев, нагрузки, PDF-отчётов и патчей коллекций.

Подписывает ли расширение XML электронной подписью?

Нет. Подпись формируется вашим криптосредством, а в PolyApiIDE отправляется уже подписанный конверт. Обещать обратное было бы нечестно.

Как узнать, SOAP 1.1 или 1.2?

По WSDL: в binding-секции указан транспорт и версия, а namespace конверта отличается. Если видите http://schemas.xmlsoap.org/soap/envelope/ — это 1.1, если http://www.w3.org/2003/05/soap-envelope — 1.2.

Что делать с большим WSDL на десятки операций?

После импорта операции раскладываются по коллекции, её можно разбить на папки и оставить в работе только нужные вызовы. Готовые файлы для тренировки лежат на странице примеров.

Поддерживаются ли вложения MTOM?

Нет, multipart-вложения по MTOM расширение не собирает. Операции без вложений работают штатно.