Фальстарт

Спецификация языка WSDL 1.1

Константин Александров, 9 декабря 2012
  1. Введение
    1. Пример WSDL-документа
    2. Соглашение об обозначениях
  2. Определение службы
    1. Структура WSDL-документа
      1. Именование и включение документов
      2. Стиль составления документа
      3. Расширение языка и связывание
      4. Документирование
    2. Тип
    3. Сообщение
      1. Часть сообщения
      2. Абстрактные / конкретные сообщения
    4. Тип порта
      1. Однонаправленный запрос
      2. Запрос-ответ
      3. Просьба-ответ
      4. Уведомление
      5. Имена элементов в рамках операции
      6. Порядок параметров в рамках операции
    5. Связывание
    6. Порт
    7. Служба

Введение

Поскольку транспортные протоколы и форматы сообщений были стандартизованы web-сообществом, появилась возможность и необходимость описания взаимодействия систем в структурированном виде. Эту задачу решает WSDL — язык на базе XML, который описывает службу как набор конечных точек, способных обмениваться сообщениями. WSDL документирует и определяет в комплексе детали взаимодействия распределённых систем в удобном для машинной обработки виде.

WSDL определяет службу (service), как набор конечных точек (endpoint), или портов (port). При этом специфичные параметры реализации — формат данных, настройки транспортного протокола — отделены от определения абстрактных сообщений (message), операций (operation) и типов портов (port type), что позволяет переиспользовать эти определения. Конкретный тип порта с указанным протоколом передачи и форматом сообщений образует связывание (binding), ассоциация связывания с конкретным сетевым адресом образует порт, а множество портов образует службу. Отсюда для описания службы в WSDL используются следующие сущности:

Тип (type)
Контейнер для описания типов данных с помощью какого-либо языка (например, XSD).
Сообщение (message)
Абстрактное типизированное определение данных для обмена.
Операция (operation)
Абстрактное описание поддерживаемого службой действия или функции.
Тип порта (port type)
Абстрактный набор операций, поддерживаемых одной или несколькими конечными точками.
Связывание (binding)
Спецификация транспортного протокола и формата данных для конкретного типа порта.
Порт (port)
Единичная конечная точка, определённая путём задания связывания и конкретного сетевого адреса.
Служба (service)
Множество связанных конечных точек.

Эти элементы будут детально описаны в следующем разделе. Важно отметить, что WSDL не вводит нового языка определения типов. WSDL признает потребность в развитом механизме типизации для описания формата сообщений и поддерживает спецификацию XML Schema (XSD) как каноническую систему типизации. Однако это вовсе не означает, что выбор грамматики ограничивается только одной XSD — использование других грамматик допустимо посредством использования механизма расширения.

Кроме того WSDL определяет общий механизм связывания. Он используется для ассоциации специфичных параметров протокола или формата и структуры данных с абстрактными сообщениями, операциями или конечными точками, что позволяет переиспользовать абстрактные определения.

В дополнение к описанию самого механизма определения служб эта спецификация даёт введение в расширения связывания (binding extension) для следующих протоколов и форматов сообщений:

Несмотря на то, что указанные выше расширения описываются в этом документе и наслаиваются на описание ядра механизма определения служб, никто не запрещает использовать другие расширения связывания вместе с WSDL.

Пример WSDL-документа

Ниже приведён пример WSDL для простой сетевой службы, которая предоставляет информацию о котировках на бирже. Она поддерживает одну операцию GetLastTradePrice, которая разворачивается в сети с использованием SOAP 1.1 поверх HTTP-транспорта. Запрос включает аббревиатуру ценной бумаги строкового типа, а ответ цену дробного типа.

  1. <?xml version="1.0"?>
  2. <definitions name="StockQuote"
  3. targetNamespace="http://example.com/stockquote.wsdl"
  4. xmlns:tns="http://example.com/stockquote.wsdl"
  5. xmlns:xsd1="http://example.com/stockquote.xsd"
  6. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  7. xmlns="http://schemas.xmlsoap.org/wsdl/">
  8. <types>
  9. <schema targetNamespace="http://example.com/stockquote.xsd"
  10. xmlns="http://www.w3.org/2000/10/XMLSchema">
  11. <element name="TradePriceRequest">
  12. <complexType>
  13. <all>
  14. <element name="tickerSymbol" type="string"/>
  15. </all>
  16. </complexType>
  17. </element>
  18. <element name="TradePrice">
  19. <complexType>
  20. <all>
  21. <element name="price" type="float"/>
  22. </all>
  23. </complexType>
  24. </element>
  25. </schema>
  26. </types>
  27. <message name="GetLastTradePriceInput">
  28. <part name="body" element="xsd1:TradePriceRequest"/>
  29. </message>
  30. <message name="GetLastTradePriceOutput">
  31. <part name="body" element="xsd1:TradePrice"/>
  32. </message>
  33. <portType name="StockQuotePortType">
  34. <operation name="GetLastTradePrice">
  35. <input message="tns:GetLastTradePriceInput"/>
  36. <output message="tns:GetLastTradePriceOutput"/>
  37. </operation>
  38. </portType>
  39. <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
  40. <soap:binding style="document"
  41. transport="http://schemas.xmlsoap.org/soap/http"/>
  42. <operation name="GetLastTradePrice">
  43. <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
  44. <input>
  45. <soap:body use="literal"/>
  46. </input>
  47. <output>
  48. <soap:body use="literal"/>
  49. </output>
  50. </operation>
  51. </binding>
  52. <service name="StockQuoteService">
  53. <documentation>My first service</documentation>
  54. <port name="StockQuotePort" binding="tns:StockQuoteBinding">
  55. <soap:address location="http://example.com/stockquote"/>
  56. </port>
  57. </service>
  58. </definitions>

Соглашение об обозначениях

В этом документе используются следующие пространства имен с префиксами:

Префикс URI пространства имен Определение
wsdl http://schemas.xmlsoap.org/wsdl/ Пространство имен фреймворка WSDL
soap http://schemas.xmlsoap.org/wsdl/soap/ WSDL-пространство имен для SOAP binding
http http://schemas.xmlsoap.org/wsdl/http/ WSDL-пространство имен для HTTP GET и POST связывания
mime http://schemas.xmlsoap.org/wsdl/mime/ WSDL-пространство имен для MIME связывания
soapenc http://schemas.xmlsoap.org/soap/encoding/ Пространство имен для атрибутики, относящейся к кодированию (сериализации) SOAP-сообщений, определено в SOAP 1.1
soapenv http://schemas.xmlsoap.org/soap/envelope/ Пространство имен SOAP-конверта (envelope), определено в SOAP 1.1
xsd http://www.w3.org/2000/10/XMLSchema Пространство имен XML схемы, определено в спецификации XSD
xsi http://www.w3.org/2000/10/XMLSchema-instance Пространство имен, ориентированное на использование в любых XML-документах для указания XSD-специфичных атрибутов, но не относящихся к непосредственному определению типов; определено в спецификации XSD
tns любой По соглашению префикс tns (от «this namespace») используется для обращения к пространству имен текущего документа
остальные любой Все остальные префиксы пространств имен используются только для примеров, в частности URI, начинающийся с http://example.com, используется для представления некоторого независимого от приложения URI

В текущей спецификации используется свободный синтаксис для описания XML-грамматики WSDL:

Определение службы

Структура WSDL-документа

  1. <wsdl:definitions name="nmtoken"? targetNamespace="uri"?>
  2. <import namespace="uri" location="uri"/> *
  3. <wsdl:documentation .... /> ?
  4. <wsdl:types> ?
  5. <wsdl:documentation .... /> ?
  6. <xsd:schema .... /> *
  7. <-- extensibility element --> *
  8. </wsdl:types>
  9. <wsdl:message name="nmtoken"> *
  10. <wsdl:documentation .... /> ?
  11. <part name="nmtoken" element="qname"? type="qname"?/> *
  12. </wsdl:message>
  13. <wsdl:portType name="nmtoken"> *
  14. <wsdl:documentation .... /> ?
  15. <wsdl:operation name="nmtoken"> *
  16. <wsdl:documentation .... /> ?
  17. <wsdl:input name="nmtoken"? message="qname"> ?
  18. <wsdl:documentation .... /> ?
  19. </wsdl:input>
  20. <wsdl:output name="nmtoken"? message="qname"> ?
  21. <wsdl:documentation .... /> ?
  22. </wsdl:output>
  23. <wsdl:fault name="nmtoken" message="qname"> *
  24. <wsdl:documentation .... /> ?
  25. </wsdl:fault>
  26. </wsdl:operation>
  27. </wsdl:portType>
  28. <wsdl:binding name="nmtoken" type="qname"> *
  29. <wsdl:documentation .... /> ?
  30. <-- extensibility element --> *
  31. <wsdl:operation name="nmtoken"> *
  32. <wsdl:documentation .... /> ?
  33. <-- extensibility element --> *
  34. <wsdl:input> ?
  35. <wsdl:documentation .... /> ?
  36. <-- extensibility element --> *
  37. </wsdl:input>
  38. <wsdl:output> ?
  39. <wsdl:documentation .... /> ?
  40. <-- extensibility element --> *
  41. </wsdl:output>
  42. <wsdl:fault name="nmtoken"> *
  43. <wsdl:documentation .... /> ?
  44. <-- extensibility element --> *
  45. </wsdl:fault>
  46. </wsdl:operation>
  47. </wsdl:binding>
  48. <wsdl:service name="nmtoken"> *
  49. <wsdl:documentation .... /> ?
  50. <wsdl:port name="nmtoken" binding="qname"> *
  51. <wsdl:documentation .... /> ?
  52. <-- extensibility element --> *
  53. </wsdl:port>
  54. <-- extensibility element --> *
  55. </wsdl:service>
  56. <-- extensibility element --> *
  57. </wsdl:definitions>

Для определения службы используются шесть основных XML-элементов:

Эти элементы будут детально описаны в разделах 2.2-2.7. В завершение этого раздела будут описаны устанавливаемые WSDL правила именования документов, включения (импорта) документов с определениями, использования расширений и добавления контекстной документации.

Именование и включение документов

Для справочных целей WSDL-документу может быть присвоено опциональное имя, оно задается в атрибуте name типа NCNAME. Также для документа может быть задан опциональный атрибут targetNamespace типа URI, который должен содержать абсолютный URI целевого пространства имён.

WSDL позволяет ассоциировать пространство имён (namespace) с адресом размещения документа (location) с помощью конструкции импорта:

  1. <definitions .... >
  2. <import namespace="uri" location="uri"/> *
  3. </definitions>

Адресация определений из подключенного документа выполняются по QName. Можно обращаться к следующим определениям импортированного документа:

Области имён определений разных видов не пересекаются — так, например, допустимо существования порта и сообщения с одинаковыми именами, но имена однотипных определений должны быть уникальны в рамках WSDL-документа.

Разрешение QName в WSDL выполняется аналогично их разрешению, описанному в спецификации XML Schema.

Стиль составления документа

Использование элемента import позволяет разнести различные элементы определения службы по разным документам. Хорошим подходом является разделение определений в соответствии с их уровнем абстракции, что позволяет создавать более структурированные, следовательно проще читаемые, понимаемые и поддерживаемые определения служб. К тому же подход способствует переиспользованию определений всех уровней.

Доработаем определение службы из первого примера — разнесём его по трём документам: определение базовых типов данных, абстрактное определение службы и связывание абстрактного определения со специфичными параметрами формата сообщений и транспорта.

Возможности механизма импорта не ограничиваются работой с видами определений, явно установленными этой спецификацией. Любые другие определения, созданные посредством механизма расширения, могут быть переиспользованы подобным образом.

  1. <?xml version="1.0"?>
  2. <schema targetNamespace="http://example.com/stockquote/schemas"
  3. xmlns="http://www.w3.org/2000/10/XMLSchema">
  4. <element name="TradePriceRequest">
  5. <complexType>
  6. <all>
  7. <element name="tickerSymbol" type="string"/>
  8. </all>
  9. </complexType>
  10. </element>
  11. <element name="TradePrice">
  12. <complexType>
  13. <all>
  14. <element name="price" type="float"/>
  15. </all>
  16. </complexType>
  17. </element>
  18. </schema>
  1. <?xml version="1.0"?>
  2. <definitions name="StockQuote"
  3. targetNamespace="http://example.com/stockquote/definitions"
  4. xmlns:tns="http://example.com/stockquote/definitions"
  5. xmlns:xsd1="http://example.com/stockquote/schemas"
  6. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  7. xmlns="http://schemas.xmlsoap.org/wsdl/">
  8. <import namespace="http://example.com/stockquote/schemas"
  9. location="http://example.com/stockquote/stockquote.xsd"/>
  10. <message name="GetLastTradePriceInput">
  11. <part name="body" element="xsd1:TradePriceRequest"/>
  12. </message>
  13. <message name="GetLastTradePriceOutput">
  14. <part name="body" element="xsd1:TradePrice"/>
  15. </message>
  16. <portType name="StockQuotePortType">
  17. <operation name="GetLastTradePrice">
  18. <input message="tns:GetLastTradePriceInput"/>
  19. <output message="tns:GetLastTradePriceOutput"/>
  20. </operation>
  21. </portType>
  22. </definitions>
  1. <?xml version="1.0"?>
  2. <definitions name="StockQuote"
  3. targetNamespace="http://example.com/stockquote/service"
  4. xmlns:tns="http://example.com/stockquote/service"
  5. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  6. xmlns:defs="http://example.com/stockquote/definitions"
  7. xmlns="http://schemas.xmlsoap.org/wsdl/">
  8. <import namespace="http://example.com/stockquote/definitions"
  9. location="http://example.com/stockquote/stockquote.wsdl"/>
  10. <binding name="StockQuoteSoapBinding" type="defs:StockQuotePortType">
  11. <soap:binding style="document"
  12. transport="http://schemas.xmlsoap.org/soap/http"/>
  13. <operation name="GetLastTradePrice">
  14. <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
  15. <input>
  16. <soap:body use="literal"/>
  17. </input>
  18. <output>
  19. <soap:body use="literal"/>
  20. </output>
  21. </operation>
  22. </binding>
  23. <service name="StockQuoteService">
  24. <documentation>My first service</documentation>
  25. <port name="StockQuotePort" binding="tns:StockQuoteBinding">
  26. <soap:address location="http://example.com/stockquote"/>
  27. </port>
  28. </service>
  29. </definitions>

Расширение языка и связывание

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

Обычно элементы расширения используются для задания параметров связывания, специфичных для применяемой технологии передачи. Чтобы различать ситуации, когда учёт этих параметров является обязательным для обмена сообщениями, элемент расширения может содержать атрибут wsdl:required логического типа. Он определён в пространстве имён WSDL и по умолчанию равен false.

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

Документирование

Для создания пользовательской документации WSDL позволяет использовать элемент wsdl:document, содержащий произвольный текст и XML-элементы («mixed content» в терминах XSD). Он может лежать под любым элементом из WSDL.

Тип

Элемент types содержит определения типов данных, соответствующих сообщениям. С целью унификации WSDL использует XSD как встроенную систему типизации и рассматривает ее как каноническую и основную.

  1. <definitions .... >
  2. <types>
  3. <xsd:schema .... /> *
  4. </types>
  5. </definitions>

Система типизации XSD может быть использована для определения типов данных в сообщениях независимо от того, будут ли сообщения передаваться в формате XML, или в каком-либо специфическом формате — в любом случае XSD-схема может быть использована для проверки структуры сообщений. Возможны случаи, когда для одного абстрактного сообщения имеются различные связывания, либо одно связывание, но не имеющее своей распространённой системы типизации. В этих случаях рекомендуется придерживаться следующих правил при описании абстрактных типов данных с помощью XSD:

Необоснованно ожидать, что в настоящем и будущем для определения типов данных будет использоваться только одна грамматика. Поэтому WSDL позволяет подключать другие системы типизации с помощью элементов расширения. Элемент расширения может быть добавлен под элемент types — он будет служить для идентификации системы типизации и для организации контейнера для определений типов. Роль такого элемента аналогична элементу schema языка XML Schema.

  1. <definitions ... >
  2. <types>
  3. <-- type-system extensibility element --> *
  4. </types>
  5. </definitions>

Сообщение

Сообщение состоит из одной или нескольких логических частей (part). Каждая часть ассоциирована с типом данных с помощью атрибута типизации, набор таких атрибутов расширяемый. WSDL определяет следующие атрибуты типизации сообщений для случая использования системы типизации XSD:

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

  1. <definitions ... >
  2. <message name="nmtoken"> *
  3. <part name="nmtoken" element="qname"? type="qname"?/> *
  4. </message>
  5. </definitions>

Атрибут name элемента message должен содержать уникальное имя сообщение в рамках текущего WSDL-документа. Атрибут name элемента part — уникальное имя части в рамках сообщения.

Часть сообщения

Часть сообщения — это гибкий механизм для описания абстрактного логического содержимого сообщения. Связывание может ссылаться на часть по имени для указания дополнительных специфичных параметров. Например, при определении сообщения для RPC часть может соответствовать одному аргументу вызываемой процедуры. Однако часть — абстрактное определение, и для работы с её реальным значением придётся обращаться к связыванию.

Если сообщение состоит из нескольких цельных компонентов, то в WSDL его можно определить как состоящее из нескольких частей. Например, следующее сообщение состоит их платежного ордера и накладной:

  1. <definitions .... >
  2. <types>
  3. <schema .... >
  4. <element name="PO" type="tns:POType"/>
  5. <complexType name="POType">
  6. <all>
  7. <element name="id" type="string"/>
  8. <element name="name" type="string"/>
  9. <element name="items">
  10. <complexType>
  11. <all>
  12. <element name="item" type="tns:Item"
  13. minOccurs="0"
  14. maxOccurs="unbounded"/>
  15. </all>
  16. </complexType>
  17. </element>
  18. </all>
  19. </complexType>
  20. <complexType name="Item">
  21. <all>
  22. <element name="quantity" type="int"/>
  23. <element name="product" type="string"/>
  24. </all>
  25. </complexType>
  26. <element name="Invoice" type="tns:InvoiceType"/>
  27. <complexType name="InvoiceType">
  28. <all>
  29. <element name="id" type="string"/>
  30. </all>
  31. </complexType>
  32. </schema>
  33. </types>
  34. <message name="PO">
  35. <part name="po" element="tns:PO"/>
  36. <part name="invoice" element="tns:Invoice"/>
  37. </message>
  38. </definitions>

Однако если содержимое сообщения достаточно сложное, то определение типа можно полностью перенести на уровень системы типизации. В следующем примере сообщение содержит платежный ордер, либо набор накладных:

  1. <definitions .... >
  2. <types>
  3. <schema .... >
  4. <!-- POType и InvoiceType - типы из прошлого примера -->
  5. <complexType name="Composite">
  6. <choice>
  7. <element name="PO" type="tns:POType"
  8. minOccurs="1" maxOccurs="1"/>
  9. <element name="Invoice" type="tns:InvoiceType"
  10. minOccurs="0" maxOccurs="unbounded"/>
  11. </choice>
  12. </complexType>
  13. </schema>
  14. </types>
  15. <message name="PO">
  16. <part name="composite" type="tns:Composite"/>
  17. </message>
  18. </definitions>

Абстрактные / конкретные сообщения

Определение сообщения всегда рассматривалось как абстрактное определение содержимого. Связывание сообщения описывает соответствие между абстрактным содержимым и конкретным форматом / представлением. Однако в некоторых случаях, абстрактное определение может очень близко, или даже однозначно, соответствовать какому-либо формату. Связывание для такого формата поставляет мало дополнительной информации, либо не поставляет совсем. Однако связывание для того же сообщения, но для другого формата, может потребовать обширных данных. Поэтому без изучения связывания невозможно сказать «насколько абстрактным» является определение сообщения.

Тип порта

Тип порта — это именованный набор абстрактных операций, ссылающихся на задействованные в обмене абстрактные сообщения.

  1. <wsdl:definitions .... >
  2. <wsdl:portType name="nmtoken">
  3. <wsdl:operation name="nmtoken" .... /> *
  4. </wsdl:portType>
  5. </wsdl:definitions>

Атрибут name задаёт уникальное имя порта среди всех портов, определённых в рамках WSDL-документа. Операция именуется также с использованием атрибута name.

В WSDL имеется четыре примитива организации способа взаимодействия, которые может поддерживать конечная точка:

WSDL рассматривает эти примитивы как операции (operation). Конечно, операции типа запрос-ответ и просьба-ответ могут быть смоделированы с использованием двух однонаправленных сообщений, однако полезно иметь такие операции как примитивы, так как:

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

Хотя WSDL и поддерживает связывания для всех четырёх примитивов, но определяет их только для примитивов однонаправленный запрос и запрос-ответ. Ожидается, что спецификации, определяющие протоколы для взаимодействий просьба-ответ и уведомление, также должны поставлять связывания для WSDL, что позволит использовать эти примитивы.

Операции просьба-ответ и уведомление искусственные, вносящие сложность и путаницу, но не приносящие дополнительную полезность. В них инициатором обмена сообщениями является служба: она первая отправляет уведомление или запрос-просьбу и получает ответ для обработки. Например, web-служба, реализующая операцию типа уведомление, будет технически реализована как HTTP-клиент, а её клиент — как HTTP-сервер.

Распространения эти операции не получили, поддерживаются только теоретически на уровне спецификации. Поэтому web-службу следует разрабатывать как обработчик запросов с соответствующим использованием в её WSDL-документе примитивов однонаправленный запрос и запрос-ответ.

Однонаправленный запрос

Грамматика определения операции следующая:

  1. <wsdl:portType .... >
  2. <wsdl:operation name="nmtoken">
  3. <wsdl:input name="nmtoken"? message="qname"/>
  4. </wsdl:operation>
  5. </wsdl:portType>

Элемент input задает абстрактное содержание сообщения-запроса.

Запрос-ответ

  1. <wsdl:portType .... >
  2. <wsdl:operation name="nmtoken" parameterOrder="nmtokens">
  3. <wsdl:input name="nmtoken"? message="qname"/>
  4. <wsdl:output name="nmtoken"? message="qname"/>
  5. <wsdl:fault name="nmtoken" message="qname"/> *
  6. </wsdl:operation>
  7. </wsdl:portType>

Элементы input и output задают абстрактное содержание запроса и ответа соответственно. Опциональные элементы fault задают абстрактное содержание сообщений об ошибках, которые могут происходить в результате выполнения операции (сверх тех, что специфичны для протокола).

Обратите внимание, что операция запрос-ответ — это абстрактное представление. Нужно рассмотреть конкретное связывание, чтобы определить, как в действительности будет передано сообщение: в рамках одного взаимодействия (как HTTP запрос и ответ), либо в рамках двух независимых взаимодействий (например, как два разных HTTP-запроса).

Просьба-ответ

  1. <wsdl:portType .... >
  2. <wsdl:operation name="nmtoken" parameterOrder="nmtokens">
  3. <wsdl:output name="nmtoken"? message="qname"/>
  4. <wsdl:input name="nmtoken"? message="qname"/>
  5. <wsdl:fault name="nmtoken" message="qname"/> *
  6. </wsdl:operation>
  7. </wsdl:portType>

Элементы output и input задают абстрактное содержание запроса-просьбы и ответа соответственно. Опциональные элементы fault задают содержание возможных сообщений об ошибках. Операция просьба-ответ также является абстрактным представлением, и для определения реального способа передачи сообщений необходимо обратиться к соответствующему связыванию.

Уведомление

  1. <wsdl:portType .... >
  2. <wsdl:operation name="nmtoken">
  3. <wsdl:output name="nmtoken"? message="qname"/>
  4. </wsdl:operation>
  5. </wsdl:portType>

Элемент output задает абстрактное содержание сообщения-уведомления.

Имена элементов в рамках операции

Атрибут name элементов input и output содержит уникальное имя среди всех таких элементов в рамках типа порта.

Чтобы избежать необходимости именования всех элементов input и output WSDL предоставляет им имена по умолчанию на основе имени операции. Если не указано имя сообщения однонаправленной операции, оно будет равно по умолчанию имени операции. Если не указано имя сообщения операции запрос-ответ, либо просьба-ответ, оно будет равно имени операции с суффиксом Request, Solicit или Response соответственно.

Так как элементов fault может быть несколько, то каждый из них должен иметь имя, чтобы ссылаться на него из связывания для задания конкретного формата сообщения. Имя должно быть уникальным среди всех элементов fault в рамках операции.

Порядок параметров в рамках операции

На уровне операции не настраивается, будет ли она использоваться вместе с RPC-связыванием. Однако при использовании операции с RPC-связыванием полезно зафиксировать сигнатуру оригинальной функции. Для этой цели операции запрос-ответ и просьба-ответ могут содержать список имён параметров в атрибуте parameterOrder типа nmtokens. Значение атрибута — список имён частей сообщения, разделённых одиночными пробелами. Значение должно соответствовать следующим правилам:

Обратите внимание, что эта информация служит только как «подсказка», поэтому может быть безопасно проигнорирована в случае незаинтересованности в RPC-сигнатуре. Кроме того она является необязательной даже в случае использования операции с RPC-связыванием.

Связывание

Связывание определяет формат сообщений и детали протокола для операций и сообщений конкретного типа порта. Одному типу порта могут соответствовать несколько разных связываний. Грамматика определения связывания следующая:

  1. <wsdl:definitions .... >
  2. <wsdl:binding name="nmtoken" type="qname"> *
  3. <-- extensibility element (1) --> *
  4. <wsdl:operation name="nmtoken"> *
  5. <-- extensibility element (2) --> *
  6. <wsdl:input name="nmtoken"?> ?
  7. <-- extensibility element (3) -->
  8. </wsdl:input>
  9. <wsdl:output name="nmtoken"?> ?
  10. <-- extensibility element (4) --> *
  11. </wsdl:output>
  12. <wsdl:fault name="nmtoken"> *
  13. <-- extensibility element (5) --> *
  14. </wsdl:fault>
  15. </wsdl:operation>
  16. </wsdl:binding>
  17. </wsdl:definitions>

Атрибут name задаёт имя связывания, уникальное среди всех связываний WSDL-документа. Связывание ссылается на тип порта с помощью атрибута type типа QName (см. Раздел 2.1.1).

Элементы расширения связывания используются для указания конкретной грамматики для входящих (3) и исходящих (4) сообщений, сообщений об ошибках (5). Также может указываться информация уровня операции (2) и уровня связывания (1).

Элемент связывания operation содержит данные для одноимённой операции связанного типа порта. Однако имя операции в общем случае не является уникальным (пример: перегрузка методов / функций — использование одинаковых имён с различными сигнатурами), потому его может быть недостаточно для однозначного определения целевой операции типа порта. В таких случаях целевая операция адресуется с помощью дополнительного задания соответствующих имён элементов wsdl:input и wsdl:output с помощью атрибута name.

Связывание должно устанавливать только один протокол.

Связывание не должно содержать информации об адресе.

Порт

Порт определяет отдельную конечную точку посредством установки адреса для связывания.

  1. <wsdl:definitions .... >
  2. <wsdl:service .... > *
  3. <wsdl:port name="nmtoken" binding="qname"> *
  4. <-- extensibility element (1) -->
  5. </wsdl:port>
  6. </wsdl:service>
  7. </wsdl:definitions>

Атрибут name задаёт уникальное имя среди всех портов в рамках WSDL-документа. Атрибут binding типа QName содержит ссылку на связывание (см. Раздел 2.1.1).

Элементы расширения (1) используются для задания адреса.

Порт не должен задавать более одного адреса.

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

Служба

Служба объединяет вместе набор связанных портов.

  1. <wsdl:definitions .... >
  2. <wsdl:service name="nmtoken"> *
  3. <wsdl:port .... /> *
  4. </wsdl:service>
  5. </wsdl:definitions>

Атрибут name задаёт уникальное имя среди всех служб, определённых в рамках WSDL-документа.

Порты внутри службы связаны следующим образом:


  1. Это вольный, частичный, дополненный перевод документа Web Services Description Language (WSDL) 1.1 от 15 Марта 2001
  2. Несклоняемыми написанными латиницей терминами оперировать крайне неудобно, к тому же они однозначно переводятся. Поэтому исходное имя даётся только при введении нового термина, а далее по тексту используется русский перевод.