Открыть сервис

WSDL

WSDL (Web Services Description Language) — это язык описания веб-сервисов на основе XML, предназначенный для формального описания интерфейсов, доступных через сеть. WSDL определяет, как обращаться к веб-сервису, какие операции он поддерживает, какие типы данных используются для обмена сообщениями и по какому сетевому протоколу (например, SOAP, HTTP) происходит взаимодействие. Стандарт разработан консорциумом W3C (World Wide Web Consortium) и является ключевым компонентом архитектуры SOA (Service-Oriented Architecture).

История и развитие

Первая версия WSDL (1.0) была предложена компаниями IBM и Microsoft в 2000 году и базировалась на более ранних форматах, таких как NASSL (IBM) и SOAP Contract Language (Microsoft). Однако эта версия не была принята W3C в качестве рекомендации. Основная версия, WSDL 1.1, была опубликована в марте 2001 года и получила широкое распространение в индустрии, став де-факто стандартом для описания веб-сервисов на основе SOAP.

В 2004 году W3C начал работу над стандартизацией WSDL 2.0, которая была завершена в 2007 году (статус W3C Recommendation). Версия 2.0 внесла значительные изменения: была упрощена модель описания, введены новые элементы для поддержки REST-подобных сервисов, улучшена поддержка не-SOAP протоколов. Однако, из-за обратной несовместимости с WSDL 1.1 и отсутствия массового перехода на новую версию, WSDL 1.1 остаётся наиболее широко используемой на практике.

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

WSDL-документ представляет собой XML-файл, который состоит из нескольких основных элементов (в версии 1.1):

  • <definitions>корневой элемент документа, содержащий объявления пространств имён и всю структуру.
  • <types>описание типов данных, используемых в сообщениях. Обычно типы определяются с помощью XML Schema Definition (XSD), что обеспечивает строгую типизацию.
  • <message>определение сообщений, которые передаются между клиентом и сервером. Каждое сообщение состоит из одной или нескольких частей (частей), каждая из которых ссылается на тип данных из блока <types>.
  • <portType> (в WSDL 2.0 — <interface>) — абстрактное определение набора операций, предоставляемых сервисом. Каждая операция имеет входное (input) и/или выходное (output) сообщение, а также может содержать сообщения об ошибках (fault).
  • <binding> — связывание абстрактного интерфейса (<portType>) с конкретным протоколом и форматом данных (например, SOAP over HTTP, MIME). В этом разделе указываются детали кодирования сообщений, стиль вызова (RPC или document), транспортный протокол и другие параметры.
  • <service> — определение точки доступа к веб-сервису. Содержит элемент <port>, который ссылается на конкретный <binding> и указывает URL (адрес) конечной точки (endpoint), по которому клиент может обратиться к сервису.

Особенности WSDL 2.0

В версии 2.0 структура была переработана: элементы <portType> и <binding> заменены на <interface> и <binding> соответственно, а <service> остаётся, но <port> заменён на <endpoint>. Кроме того, в WSDL 2.0 появилась возможность описывать сервисы, не использующие SOAP, например, RESTful сервисы на HTTP с использованием методов GET, POST, PUT, DELETE.

Принципы использования

WSDL используется для автоматической генерации кода клиентских и серверных приложений. Разработчик может взять WSDL-документ, опубликованный поставщиком сервиса, и с помощью инструментов (например, wsimport в Java или svcutil в .NET) сгенерировать заглушки для вызова операций, не вникая в детали протокола и сериализации данных.

Процесс взаимодействия с веб-сервисом на основе WSDL включает следующие шаги:

  1. Клиент получает WSDL-документ (обычно по URL, завершающемуся на ?wsdl).
  2. Клиент анализирует WSDL, определяет операции, их параметры и точки доступа.
  3. Клиент формирует SOAP-сообщение (или сообщение по другому протоколу) согласно описанию в WSDL.
  4. Сообщение отправляется на указанный endpoint.
  5. Сервер обрабатывает запрос и возвращает ответ, структура которого также задана WSDL.

Пример WSDL-документа (упрощённый)

Ниже приведён фрагмент WSDL-документа версии 1.1, описывающего простой сервис получения информации о погоде:

``xml <definitions xmlns="http://schemas.xmlsoap.org/wsdl/"; xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://example.com/weather">; <types> <xsd:schema targetNamespace="http://example.com/weather">; <xsd:element name="GetWeatherRequest" type="xsd:string"/> <xsd:element name="GetWeatherResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="Temperature" type="xsd:double"/> <xsd:element name="Condition" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </types> <message name="GetWeatherInput"> <part name="parameters" element="tns:GetWeatherRequest"/> </message> <message name="GetWeatherOutput"> <part name="parameters" element="tns:GetWeatherResponse"/> </message> <portType name="WeatherPortType"> <operation name="GetWeather"> <input message="tns:GetWeatherInput"/> <output message="tns:GetWeatherOutput"/> </operation> </portType> <binding name="WeatherBinding" type="tns:WeatherPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>; <operation name="GetWeather"> <soap:operation soapAction="http://example.com/weather/GetWeather"/>; <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="WeatherService"> <port name="WeatherPort" binding="tns:WeatherBinding"> <soap:address location="http://example.com/weather"/>; </port> </service> </definitions> ``

Связь с другими технологиями

WSDL тесно связан с такими стандартами, как:

  • SOAP (Simple Object Access Protocol) — протокол обмена структурированными сообщениями в распределённой среде. Большинство WSDL-документов описывают сервисы, использующие SOAP.
  • XML Schema (XSD) — используется в блоке <types> для определения типов данных, используемых в сообщениях.
  • UDDI (Universal Description, Discovery, and Integration) — реестр веб-сервисов, где можно публиковать и находить WSDL-документы. На практике UDDI не получил широкого распространения.
  • REST (Representational State Transfer) — WSDL 2.0 позволяет описывать REST-сервисы, но для REST чаще используются другие форматы описания, такие как OpenAPI (OAS) или RAML.

Критика и альтернативы

Основные недостатки WSDL связаны со сложностью и громоздкостью XML-структуры, а также с ориентацией на SOAP-сервисы, которые в последние годы уступают позиции подходам REST и gRPC. Критики отмечают избыточность и трудоёмкость создания и сопровождения WSDL-документов вручную. Кроме того, использование WSDL часто приводит к сильной связности клиента и сервера через общие типы данных и протоколы, что противоречит принципам слабой связанности REST.

Альтернативными форматами описания сервисов являются:

  • OpenAPI 3.x (ранее Swagger) — популярный стандарт для описания RESTful API на JSON или YAML.
  • GraphQL — язык запросов и описания данных, не требующий отдельного файла с описанием интерфейса, но имеющий встроенную систему типов.
  • gRPC (HTTP/2 + Protocol Buffers) — альтернатива SOAP, где описание сервиса задаётся в файлах .proto, а не в XML.

Тем не менее, WSDL остаётся важным стандартом в корпоративных системах, где используются SOAP-сервисы и подходы SOA, особенно в финансовом и телекоммуникационном секторах.

Применение в России

В России WSDL применяется в промышленных интеграционных проектах, использующих платформы Oracle SOA Suite, IBM WebSphere, SAP PI/PO и другие. Также WSDL используется при описании интерфейсов государственных информационных систем, например, в рамках системы межведомственного электронного взаимодействия (СМЭВ) для описания сервисов обмена данными между органами власти.

Источники:

  • W3C Recommendation: Web Services Description Language (WSDL) 1.1 (2001)
  • W3C Recommendation: Web Services Description Language (WSDL) Version 2.0 (2007)
  • Книга: "Web Services: Principles and Technology" by Michael P. Papazoglou
  • Документация к платформам Oracle SOA Suite и SAP NetWeaver

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →