Документация / WSDL

Привязка SOAP

Привязка SOAP описывает, как операции интерфейса передаются в сообщениях SOAP 1.1 (пространство имён http://schemas.xmlsoap.org/wsdl/soap/, префикс soap). Для SOAP 1.2 есть аналогичная привязка с пространством имён http://schemas.xmlsoap.org/wsdl/soap12/.

soap:binding

<wsdl:binding name="OrdersSoapBinding" type="tns:OrdersPortType">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  ...
</wsdl:binding>
АтрибутЗначение
transportТранспорт. http://schemas.xmlsoap.org/soap/http — SOAP поверх HTTP
styleСтиль по умолчанию для операций: document или rpc

soap:operation

soap:operation задаёт для операции:

  • soapAction — значение HTTP-заголовка SOAPAction в запросе (для SOAP 1.1 заголовок обязателен, значение может быть пустым);
  • style — переопределяет стиль привязки для этой операции.

Стили document и rpc

  • document — тело SOAP содержит XML-документы, описанные в схеме: части сообщения ссылаются на элементы (element), и тело — это ровно эти элементы.
  • rpc — тело SOAP — вызов процедуры: элемент с именем операции, внутри — элементы-параметры по именам частей (части ссылаются на типы через type).

soap:body: literal и encoded

soap:body внутри input/output операции описывает содержимое тела:

АтрибутЗначение
useliteral — тело точно соответствует схеме; encoded — данные закодированы по правилам SOAP Encoding
partsКакие части сообщения попадают в тело (по умолчанию — все)
namespaceПространство имён элемента-обёртки (для стиля rpc)
encodingStyleПравила кодирования (для encoded)

Сочетание document/literal — стандарт де-факто: его требует профиль совместимости WS-I Basic Profile. Вариант rpc/literal тоже допустим. Вариант encoded считается устаревшим и несовместимым со многими современными инструментами.

soap:header

soap:header выносит часть сообщения в заголовок SOAP — так передают токены авторизации, идентификаторы трассировки, параметры транзакции.

<wsdl:operation name="CreateOrder">
  <soap:operation soapAction="http://example.com/orders/CreateOrder"/>
  <wsdl:input>
    <soap:header message="tns:AuthHeader" part="token" use="literal"/>
    <soap:body use="literal"/>
  </wsdl:input>
  <wsdl:output>
    <soap:body use="literal"/>
  </wsdl:output>
  <wsdl:fault name="ValidationFault">
    <soap:fault name="ValidationFault" use="literal"/>
  </wsdl:fault>
</wsdl:operation>

soap:fault

soap:fault описывает, как ошибка из portType передаётся в элементе detail ответа SOAP Fault. Имя в soap:fault совпадает с именем wsdl:fault операции.

soap:address

soap:address location="…" внутри wsdl:port задаёт адрес конечной точки сервиса.

Пример сервиса заказов

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="OrdersService"
    targetNamespace="http://example.com/orders"
    xmlns:tns="http://example.com/orders"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <xs:schema targetNamespace="http://example.com/orders" elementFormDefault="qualified">
      <xs:element name="Token" type="xs:string"/>
      <xs:element name="CreateOrder">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="customerId" type="xs:string"/>
            <xs:element name="item" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="sku" type="xs:string"/>
                  <xs:element name="quantity" type="xs:positiveInteger"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CreateOrderResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="orderNumber" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="ValidationError">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="code" type="xs:string"/>
            <xs:element name="message" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </wsdl:types>
  <wsdl:message name="CreateOrderRequest">
    <wsdl:part name="parameters" element="tns:CreateOrder"/>
  </wsdl:message>
  <wsdl:message name="CreateOrderResponse">
    <wsdl:part name="parameters" element="tns:CreateOrderResponse"/>
  </wsdl:message>
  <wsdl:message name="AuthHeader">
    <wsdl:part name="token" element="tns:Token"/>
  </wsdl:message>
  <wsdl:message name="ValidationFault">
    <wsdl:part name="fault" element="tns:ValidationError"/>
  </wsdl:message>
  <wsdl:portType name="OrdersPortType">
    <wsdl:operation name="CreateOrder">
      <wsdl:input message="tns:CreateOrderRequest"/>
      <wsdl:output message="tns:CreateOrderResponse"/>
      <wsdl:fault name="ValidationFault" message="tns:ValidationFault"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="OrdersSoapBinding" type="tns:OrdersPortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="CreateOrder">
      <soap:operation soapAction="http://example.com/orders/CreateOrder"/>
      <wsdl:input>
        <soap:header message="tns:AuthHeader" part="token" use="literal"/>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ValidationFault">
        <soap:fault name="ValidationFault" use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="OrdersService">
    <wsdl:port name="OrdersPort" binding="tns:OrdersSoapBinding">
      <soap:address location="https://api.example.com/orders"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Обновлено: 30 сентября 2026 г.