A Web Services Primer
by Venu Vasudevan | Pages: 1, 2, 3

WSDL (Web Services Definition Language)

WSDL provides a way for service providers to describe the basic format of web service requests over different protocols or encodings. WSDL is used to describe what a web service can do, where it resides, and how to invoke it.  While the claim of SOAP/HTTP independence is made in various specifications, WSDL makes the most sense if it assumes SOAP/HTTP/MIME as the remote object invocation mechanism. UDDI registries describe numerous aspects of  web services, including the binding details of the service. WSDL fits into the subset of a UDDI service description.

WSDL defines services as collections of network endpoints or ports. In WSDL the abstract definition of endpoints and messages is separated from their concrete network deployment or data format bindings. This allows the reuse of abstract definitions of messages, which are abstract descriptions of the data being exchanged, and port types, which are abstract  collections of operations. The concrete protocol and data format specifications for a particular port type constitute a reusable binding. A port is defined by associating a network address with a reusable binding; a collection of ports define a service. And, thus, a WSDL document uses the following elements in the definition of network services:

So, in plain English, WSDL is  a template for how services should be described and bound by clients.

In what follows, I've described a stock quote service advertisement and a sample request/response pair for the service, which seeks the current quote on Motorola (ticker: MOT).

Service Advertisement

<?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/1999/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" 
          namespace="http://example.com/stockquote.xsd"
          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
       </input>
      <output>
       <soap:body use="literal" 
         namespace="http://example.com/stockquote.xsd"
         encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </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>

  <binding name="StockQuoteServiceBinding"
   type="StockQuoteServiceType"> 
    <soap:binding style="rpc"
     transport="http://schemas.xmlsoap.org/soap/http"/>
	 <operation name="getQuote">  
	  <soap:operation    
       soapAction="http://www.getquote.com/GetQuote"/>
        <input>
         <soap:body type="InMessageRequest"
          namespace="urn:live-stock-quotes"
          encoding="http://schemas.xmlsoap.org/soap/encoding/"/>
        </input>
        <output>
         <soap:body type="OutMessageResponse"
          encoding="http://schemas.xmlsoap.org/soap/encoding/"/>
        </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>

A SOAP enveloped request to the StockQuote service

POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
   <SOAP-ENV:Body>
    <m:GetLastTradePrice
     xmlns:m="Some-URI">
      <symbol>MOT</symbol>
    </m:GetLastTradePrice>     
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A SOAP enveloped response to the StockQuote service


HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>   
 <SOAP-ENV:Body>
  <m:GetLastTradePriceResponse
   xmlns:m="Some-URI">
   <Price>14.5</Price>
  </m:GetLastTradePriceResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Pages: 1, 2, 3

Next Page