Базовое понимание структуры WSDL — объяснение (язык описания веб-сервисов)
Опубликовано: 2020-08-24Возможно, вы видели мой предыдущий пост о вызовах SOAP и REST. В настоящее время компании переходят на сервисные вызовы REST, но все же большинство компаний по-прежнему используют SOAP вместо REST. В этом руководстве объясняются основы WSDL (языка описания веб-служб).
Если у вас есть какие-либо из следующих вопросов, то вы находитесь в правильном месте:
- Что такое язык описания веб-служб (WSDL)?
- Учебник по WSDL
- Объяснение языка описания веб-сервисов (WSDL)
- Примеры WSDL — языка описания веб-служб
Язык описания веб-служб (WSDL)
В Java Web Development World WSDL представляет собой формат XML для описания сетевых служб как набора конечных точек, работающих с сообщениями, содержащими либо документо-ориентированную, либо процедурно-ориентированную информацию.
Операции и сообщения описываются абстрактно, а затем привязываются к конкретному сетевому протоколу и формату сообщения для определения конечной точки. Связанные конкретные конечные точки объединяются в абстрактные конечные точки (сервисы).
WSDL расширяется, позволяя описывать конечные точки и их сообщения независимо от того, какие форматы сообщений или сетевые протоколы используются для связи, однако единственные привязки, описанные в этом документе, описывают, как использовать WSDL
в сочетании с SOAP 1.1, HTTP GET/POST и МИМ.

Другой должен прочитать:
- Создайте образец WSDL в Eclipse и сгенерируйте клиента
- Как создать службу RESTful с Java, используя JAX-RS и Джерси (пример)
Другими словами: документ WSDL определяет службы как наборы сетевых конечных точек или ports
. В WSDL абстрактное определение конечных точек и сообщений отделено от их конкретного сетевого развертывания или привязок формата данных. Это позволяет повторно использовать абстрактные определения: messages
, которые являются абстрактными описаниями данных, которыми обмениваются, и типы портов, которые являются абстрактными наборами операций.
Конкретные спецификации протокола и формата данных для определенного типа порта представляют собой многократно используемую binding
. Порт определяется путем связывания сетевого адреса с многократно используемой привязкой, а набор портов определяет службу.
Следовательно, документ WSDL использует следующие элементы в определении сетевых служб:
-
Types
— контейнер для определений типов данных с использованием некоторой системы типов (например,XSD
). -
Message
– абстрактное типизированное определение передаваемых данных. -
Operation
— абстрактное описание действия, поддерживаемого сервисом. -
Port Type
— абстрактный набор операций, поддерживаемых одной или несколькими конечными точками. -
Binding
— конкретный протокол и спецификация формата данных для определенного типа порта. -
Port
— единая конечная точка, определяемая как комбинация привязки и сетевого адреса. -
Service
— набор связанных конечных точек.
Элемент | Описание |
---|---|
<типы> | Определяет типы данных (схема XML), используемые веб-службой. |
<сообщение> | Определяет элементы данных для каждой операции |
<тип порта> | Описывает операции, которые могут быть выполнены, и соответствующие сообщения. |
<привязка> | Определяет протокол и формат данных для каждого типа порта. |
Пример: запрос/ответ SOAP 1.1 через HTTP
Пример XML-документа WSDL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<? xml version = "1.0" ?> < definitions name = "StockQuote" targetNamespace = "http://example.com/stockquote.wsdl" xmlns : tns = "http://example.com/stockquote.wsdl" xmlns : xsd1 = "http://example.com/stockquote.xsd" xmlns : soap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns = "http://schemas.xmlsoap.org/wsdl/" > < types > < schema targetNamespace = "http://example.com/stockquote.xsd" xmlns = "http://www.w3.org/2000/10/XMLSchema" > < element name = "TradePriceRequest" > < complexType > < all > < element name = "tickerSymbol" type = "string" / > < / all > < / complexType > < / element > < element name = "TradePrice" > < complexType > < all > < element name = "price" type = "float" / > < / all > < / complexType > < / element > < / schema > < / types > < message name = "GetLastTradePriceInput" > < part name = "body" element = "xsd1:TradePriceRequest" / > < / message > < message name = "GetLastTradePriceOutput" > < part name = "body" element = "xsd1:TradePrice" / > < / message > < portType name = "StockQuotePortType" > < operation name = "GetLastTradePrice" > < input message = "tns:GetLastTradePriceInput" / > < output message = "tns:GetLastTradePriceOutput" / > < / operation > < / portType > < binding name = "StockQuoteSoapBinding" type = "tns:StockQuotePortType" > < soap : binding style = "document" transport = "http://schemas.xmlsoap.org/soap/http" / > < operation name = "GetLastTradePrice" > < soap : operation soapAction = "http://example.com/GetLastTradePrice" / > < input > < soap : body use = "literal" / > < / input > < output > < soap : body use = "literal" / > < / output > < / operation > < / binding > < service name = "StockQuoteService" > < documentation > My first service < / documentation > < port name = "StockQuotePort" binding = "tns:StockQuoteBinding" > < soap : address location = "http://example.com/stockquote" / > < / port > < / service > < / definitions > |

Пример SOAP 2.0 WSDL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
< ! -- Crunchify ' s example of WSDL 2.0 -- > <? xml version = "1.0" encoding = "UTF-8" ?> < definitions xmlns = "http://www.w3.org/ns/wsdl" xmlns : tns = "http://www.tmsws.com/wsdl20sample" xmlns : whttp = "http://schemas.xmlsoap.org/wsdl/http/" xmlns : wsoap = "http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace = "http://www.tmsws.com/wsdl20sample" > < ! -- Abstract type -- > < types > < xs : schema xmlns : xs = "http://www.w3.org/2001/XMLSchema" xmlns = "http://www.tmsws.com/wsdl20sample" targetNamespace = "http://crunchify.com/wsdl20" > < xs : element name = "request" > . . . add your code here . . . < / xs : element > < xs : element name = "response" > . . . add your code here . . . < / xs : element > < / xs : schema > < / types > < ! -- Abstract interfaces -- > < interface name = "CrunchifyItem" > < fault name = "ErrorDescription" element = "tns:response" / > < operation name = "Get" pattern = "http://www.w3.org/ns/wsdl/in-out" > < input messageLabel = "In" element = "tns:request" / > < output messageLabel = "Out" element = "tns:response" / > < / operation > < / interface > < ! -- Concrete Binding Over HTTP -- > < binding name = "HttpBinding" interface = "tns:CrunchifyItem" type = "http://www.w3.org/ns/wsdl/http" > < operation ref = "tns:Get" whttp : method = "GET" / > < / binding > < ! -- Concrete Binding with SOAP -- > < binding name = "SoapBinding" interface = "tns:CrunchifyItem" type = "http://www.w3.org/ns/wsdl/soap" wsoap : protocol = "http://www.w3.org/2003/05/soap/bindings/HTTP/" wsoap : mepDefault = "http://www.w3.org/2003/05/soap/mep/request-response" > < operation ref = "tns:Get" / > < / binding > < ! -- Web Service offering endpoints for both bindings -- > < service name = "ServiceOne" interface = "tns:CrunchifyItem" > < endpoint name = "HttpEndpoint" binding = "tns:HttpBinding" address = "http://www.example.com/rest/" / > < endpoint name = "SoapEndpoint" binding = "tns:SoapBinding" address = "http://crunchify.com/soap/" / > < / service > < / definitions > |
Фабричный шаблон проектирования объясняется на примере.

Дайте знать, если у вас появятся вопросы.