XML WSDL

Web Services Description Language for defining services

📄 What is WSDL?

WSDL (Web Services Description Language) is an XML format that describes web services. It defines service operations, message formats, protocols, and endpoints for client-server communication.


<!-- Basic WSDL Structure -->
<definitions>
  <types>...</types>
  <message>...</message>
  <portType>...</portType>
</definitions>
                                    

WSDL Components

📦

Types

Define data types used in messages

<types>
  <xs:schema>...</xs:schema>
</types>
💬

Messages

Define data being exchanged

<message name="GetUserRequest">
  <part name="userId" type="xs:int"/>
</message>
🔌

Port Type

Define operations and messages

<portType name="UserService">
  <operation name="getUser">...</operation>
</portType>
🔗

Binding

Specify protocol and format

<binding name="UserBinding" 
  type="tns:UserService">...</binding>

🔹 Simple WSDL Example

A basic WSDL document defining a simple calculator service with add and subtract operations. This shows the fundamental structure of a WSDL file.

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="CalculatorService"
  targetNamespace="http://example.com/calculator"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="http://example.com/calculator"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- Types -->
  <types>
    <xs:schema targetNamespace="http://example.com/calculator">
      <xs:element name="AddRequest">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="a" type="xs:int"/>
            <xs:element name="b" type="xs:int"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AddResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="result" type="xs:int"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </types>

  <!-- Messages -->
  <message name="AddRequestMsg">
    <part name="parameters" element="tns:AddRequest"/>
  </message>
  <message name="AddResponseMsg">
    <part name="parameters" element="tns:AddResponse"/>
  </message>

  <!-- Port Type -->
  <portType name="CalculatorPortType">
    <operation name="Add">
      <input message="tns:AddRequestMsg"/>
      <output message="tns:AddResponseMsg"/>
    </operation>
  </portType>

</definitions>

WSDL Structure:

✅ Types define request/response structure

✅ Messages reference the types

✅ PortType defines the Add operation

🔹 WSDL Binding

Binding specifies the protocol and data format for the service. It connects the abstract definition to concrete implementation details like SOAP over HTTP.

<!-- SOAP Binding -->
<binding name="CalculatorBinding" type="tns:CalculatorPortType">
  <soap:binding style="document" 
    transport="http://schemas.xmlsoap.org/soap/http"/>
  
  <operation name="Add">
    <soap:operation soapAction="http://example.com/calculator/Add"/>
    <input>
      <soap:body use="literal"/>
    </input>
    <output>
      <soap:body use="literal"/>
    </output>
  </operation>
</binding>

Binding Attributes:

  • style: "document" or "rpc" (Remote Procedure Call)
  • transport: Protocol used (usually HTTP)
  • use: "literal" or "encoded" for message format
  • soapAction: URI identifying the operation

🔹 WSDL Service and Port

The service element defines the endpoint where the web service is accessible. It combines binding with the actual URL location.

<!-- Service Definition -->
<service name="CalculatorService">
  <documentation>
    A simple calculator web service
  </documentation>
  
  <port name="CalculatorPort" binding="tns:CalculatorBinding">
    <soap:address location="http://example.com/calculator"/>
  </port>
</service>

Service Components:

Service: Container for ports

Port: Single endpoint for the service

Address: URL where service is hosted

🔹 Complete WSDL Example

A full WSDL document for a user management service with all components:

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="UserService"
  targetNamespace="http://example.com/users"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="http://example.com/users"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- Data Types -->
  <types>
    <xs:schema targetNamespace="http://example.com/users">
      <xs:element name="GetUserRequest">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="userId" type="xs:int"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      
      <xs:element name="GetUserResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="id" type="xs:int"/>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="email" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </types>

  <!-- Messages -->
  <message name="GetUserRequestMsg">
    <part name="parameters" element="tns:GetUserRequest"/>
  </message>
  <message name="GetUserResponseMsg">
    <part name="parameters" element="tns:GetUserResponse"/>
  </message>

  <!-- Port Type -->
  <portType name="UserPortType">
    <operation name="GetUser">
      <input message="tns:GetUserRequestMsg"/>
      <output message="tns:GetUserResponseMsg"/>
    </operation>
  </portType>

  <!-- Binding -->
  <binding name="UserBinding" type="tns:UserPortType">
    <soap:binding style="document" 
      transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetUser">
      <soap:operation soapAction="http://example.com/users/GetUser"/>
      <input><soap:body use="literal"/></input>
      <output><soap:body use="literal"/></output>
    </operation>
  </binding>

  <!-- Service -->
  <service name="UserService">
    <port name="UserPort" binding="tns:UserBinding">
      <soap:address location="http://example.com/api/users"/>
    </port>
  </service>

</definitions>

🔹 WSDL Operation Types

WSDL supports different operation patterns for various communication scenarios:

<!-- One-way: Client sends message, no response -->
<operation name="LogMessage">
  <input message="tns:LogMessageRequest"/>
</operation>

<!-- Request-Response: Client sends, server responds -->
<operation name="GetUser">
  <input message="tns:GetUserRequest"/>
  <output message="tns:GetUserResponse"/>
</operation>

<!-- Solicit-Response: Server initiates, client responds -->
<operation name="NotifyUser">
  <output message="tns:NotificationMessage"/>
  <input message="tns:AcknowledgmentMessage"/>
</operation>

<!-- Notification: Server sends message, no response -->
<operation name="SendAlert">
  <output message="tns:AlertMessage"/>
</operation>

Operation Patterns:

  • One-way: Fire and forget (logging, notifications)
  • Request-Response: Most common (queries, updates)
  • Solicit-Response: Server-initiated (callbacks)
  • Notification: Server push (alerts, events)

🔹 Using WSDL

How clients and servers use WSDL documents:

Client Side:

  1. Retrieve WSDL from service URL
  2. Generate client code from WSDL
  3. Call service operations using generated code
  4. Handle responses according to WSDL definitions

Server Side:

  1. Define service operations and data types
  2. Generate WSDL from service implementation
  3. Publish WSDL at service endpoint
  4. Process requests according to WSDL contract

🧠 Test Your Knowledge

What does WSDL stand for?