Web Services Description Language (WSDL) is an XML-based language used for describing the functionality offered by a web service. It acts as a contract between the service provider and the consumer, detailing the methods available, the input and output parameters, and the protocols used for communication. WSDL is a key component in the world of SOAP-based web services, though it can also be used with other protocols.
Key Features of WSDL
- Service Definition: WSDL provides a detailed definition of the web service, including the operations available and how to interact with them.
- Language and Platform Neutrality: WSDL is an XML-based language, making it platform and language-independent.
- Automatic Code Generation: Many development tools can generate client and server code based on a WSDL file, simplifying the process of interacting with web services.
- Extensibility: WSDL can be extended with additional elements to provide more detailed service descriptions.
WSDL Structure
A WSDL document is divided into several key sections:
- Types: Defines the data types used by the web service.
- Messages: Describes the messages used by the service, including input and output parameters.
- Port Types: Defines the operations (or methods) available in the service.
- Bindings: Specifies the protocols and data formats used by the service.
- Service: Specifies the endpoint (URL) where the service can be accessed.
Example WSDL Document
Here is a simple example of a WSDL document for a fictional “StockQuote” service that provides stock prices.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://example.com/stockquote"
name="StockQuoteService">
<!-- Types Section -->
<wsdl:types>
<xsd:schema targetNamespace="http://example.com/stockquote">
<xsd:element name="getStockPriceRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="stockSymbol" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getStockPriceResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="price" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<!-- Messages Section -->
<wsdl:message name="getStockPriceInput">
<wsdl:part name="parameters" element="tns:getStockPriceRequest"/>
</wsdl:message>
<wsdl:message name="getStockPriceOutput">
<wsdl:part name="parameters" element="tns:getStockPriceResponse"/>
</wsdl:message>
<!-- Port Types Section -->
<wsdl:portType name="StockQuotePortType">
<wsdl:operation name="getStockPrice">
<wsdl:input message="tns:getStockPriceInput"/>
<wsdl:output message="tns:getStockPriceOutput"/>
</wsdl:operation>
</wsdl:portType>
<!-- Bindings Section -->
<wsdl:binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getStockPrice">
<soap:operation soapAction="http://example.com/stockquote/getStockPrice"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<!-- Service Section -->
<wsdl:service name="StockQuoteService">
<wsdl:port name="StockQuotePort" binding="tns:StockQuoteSoapBinding">
<soap:address location="http://example.com/stockquoteservice"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Breakdown of the WSDL Document
1. Types Section
This section defines the data types used in the web service. In the example above, two complex types are defined: getStockPriceRequest
and getStockPriceResponse
. These types are used to represent the request and response messages, respectively.
2. Messages Section
In the Messages
section, two messages are defined: getStockPriceInput
and getStockPriceOutput
. Each message corresponds to the input and output of the getStockPrice
operation. The part
element links the messages to the elements defined in the Types
section.
3. Port Types Section
The PortType
section defines the operations provided by the web service. In this case, the StockQuotePortType
port type defines a single operation called getStockPrice
. This operation has an input message (getStockPriceInput
) and an output message (getStockPriceOutput
).
4. Bindings Section
The Bindings
section specifies the protocol used by the service. In this example, the service uses SOAP over HTTP. The binding
element specifies that the service uses document-style SOAP messaging, and the soapAction
attribute defines the SOAP action for the getStockPrice
operation.
5. Service Section
The Service
section defines the web service and the endpoints where it can be accessed. The StockQuoteService
service has a single port (StockQuotePort
) that uses the StockQuoteSoapBinding
binding. The soap:address
element specifies the URL where the service is hosted.
Code Example: Generating Client and Server from WSDL
Step 1: Generate Server Code
Using the Apache CXF or any similar tool, you can generate server-side code from a WSDL file. For example, with Apache CXF, you can use the wsdl2java
tool:
wsdl2java -server -d src -p com.example.stockquote http://example.com/stockquote?wsdl
This command generates server-side skeleton code that you can implement.
Step 2: Implement the Service
Here’s an example of how you might implement the getStockPrice
operation in Java:
package com.example.stockquote;
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.stockquote.StockQuotePortType")
public class StockQuoteServiceImpl implements StockQuotePortType {
@Override
public float getStockPrice(String stockSymbol) {
// Example implementation: return a fixed price for demonstration
if ("GOOGL".equalsIgnoreCase(stockSymbol)) {
return 2725.50f;
} else if ("AAPL".equalsIgnoreCase(stockSymbol)) {
return 145.32f;
} else {
return 0.0f;
}
}
}
Step 3: Publish the Service
To make the service available, you would publish it as follows:
package com.example.stockquote;
import javax.xml.ws.Endpoint;
public class StockQuoteServicePublisher {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/stockquoteservice", new StockQuoteServiceImpl());
System.out.println("StockQuoteService is now running at http://localhost:8080/stockquoteservice");
}
}
Step 4: Generate Client Code
To interact with the service, you can generate client code using the same wsdl2java
tool:
wsdl2java -client -d src -p com.example.stockquote http://localhost:8080/stockquoteservice?wsdl
Step 5: Consume the Web Service
Here’s how you might consume the web service from a client:
package com.example.stockquote;
public class StockQuoteClient {
public static void main(String[] args) {
StockQuoteService service = new StockQuoteServiceImplService().getStockQuoteServiceImplPort();
float price = service.getStockPrice("GOOGL");
System.out.println("The price of GOOGL is: " + price);
}
}
Running this client code will output the stock price retrieved from the service.
WSDL and Service Interoperability
WSDL plays a crucial role in ensuring interoperability between different systems and platforms. By providing a standard way to describe the web service, WSDL allows different applications to communicate with each other, regardless of the underlying technology stack.
Conclusion
WSDL is a fundamental technology in the world of web services, providing a clear contract between service providers and consumers. It describes the operations available, the input and output parameters, and the protocols used, making it easier for different systems to interact.
This article has provided a comprehensive overview of WSDL, including its structure, an example WSDL document, and how to generate client and server code from a WSDL file using Java. Understanding WSDL is crucial for working with SOAP-based web services and ensuring interoperability in distributed systems.