Cover page images (keys)

Foundations And Future Directions of Web Services

Hugo Haas <[email protected]>
W3C Web Services Activity Lead

Charlton Barreto, Adobe Systems Inc.
Member of the W3C Web Services Description & Choreography Working Groups

ECOWS 2005, Växjö, Sweden, 14 November 2005

Outline

Example of use of Web services

Web merchant

What Web services are trying to achieve

A lot of buzzwords…

… translating to an architecture

… justifying some choices:

XML-based messages
for platform-independent machine processing
Framework focused on extensibility
facilitating interoperability
Machine-processable descriptions
facilitating integration
Loose coupling
maximizing scalability

Traditional Web interaction

Traditional Web interaction

Web services interaction

Web services interaction

Web services at W3C

Stack of W3C Web services technologies

Messages

  1. Messaging framework
  2. Description formats
  3. Looking in the future

Messaging framework for Web services

Built on top of Web technologies:

Messaging framework

SOAP Version 1.2

SOAP message

The SOAP envelope

SOAP message

SOAP message path

SOAP message path

Example of a SOAP message

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
 <env:Header>
  <m:reservation xmlns:m="http://travelcompany.example.org/reservation" 
          env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
          env:mustUnderstand="true">
   <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
   <m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime>
  </m:reservation>
 </env:Header>
 <env:Body>
  <p:itinerary
    xmlns:p="http://travelcompany.example.org/reservation/travel">
   …
  </p:itinerary>
 </env:Body>
</env:Envelope>

Message exchange patterns

Underlying protocols binding

SOAP 1.2 HTTP Binding

Simple addition service

public class MathService
{
    static int total=0;

    // Add an integer and return the total
    public int add(int a)
    {
        total += a;
        return total;
    }
    
    // Get the total of all the additions
    public int total()
    {
        return total;
    }
    
}

Deployed with Axis 1.3

Simple addition client

import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.soap.SOAPConstants;
import javax.xml.rpc.ParameterMode;

public class AddClient
{
   public static void main(String [] args) throws Exception {

       if (args == null || args.length != 1) {
           System.err.println("Usage: AddClient <int>");
           return;
       }
       
       Call call = new Call("http://localhost:8080/axis/MathService.jws");
       call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);

       Integer i = new Integer(args[0]);

       call.setOperationName("add");
       call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
       call.setReturnType(XMLType.XSD_INT);

       Integer ret = (Integer) call.invoke(new Object [] { i });
       
       System.out.println("Added " + i + ". Current total: " + ret);
   }
}

POST example: adding a value

hugo@jibboom ~/ws-setup% java AddClient 432
Added 432. Current total: 3468

produces the following HTTP request:

POST /axis/MathService.jws HTTP/1.0
Content-Type: application/soap+xml; charset=UTF-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.3
Host: 127.0.0.1:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 363

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <add soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <a xsi:type="xsd:int">432</a>
    </add>
  </soapenv:Body>
</soapenv:Envelope>

resulting in the following HTTP reply:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=16ADA5B3AB2CBE3BA1582201B4F8BC28; Path=/axis
Content-Type: application/soap+xml;charset=UTF-8
Date: Wed, 19 Oct 2005 14:34:48 GMT
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <addResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <ns1:result xmlns:ns1="http://www.w3.org/2003/05/soap-rpc">addReturn</ns1:result>
      <addReturn xsi:type="xsd:int">3468</addReturn>
    </addResponse>
  </soapenv:Body>
</soapenv:Envelope>

GET example: retrieving the total

GET /axis/MathService.jws?method=total HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 (Debian package 1.0.7-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.8,fr;q=0.6,de;q=0.4,es;q=0.2
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: JSESSIONID=9B2EB217BEA1C3EB8DEE1FE1F5E283B9

returns:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml;charset=ISO-8859-1
Content-Length: 410
Date: Wed, 19 Oct 2005 14:40:30 GMT

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <totalResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <totalReturn xsi:type="xsd:int">3468</totalReturn>
    </totalResponse>
  </soapenv:Body>
</soapenv:Envelope>

Note about encoding of the message

SOAP Extensibility: SOAP modules

SOAP extensibility: SOAP features

mustUnderstand example: updated client

import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.soap.SOAPConstants;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.Constants;

public class AddClientMU
{
   public static void main(String [] args) throws Exception {
       
       if (args == null || args.length != 1) {
           System.err.println("Usage: AddClient <int>");
           return;
       }
       
       Call call = new Call("http://localhost:8080/axis/MathService.jws");
       call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);

       SOAPHeaderElement header = new SOAPHeaderElement("http://example.com/header",
                                                        "very-important-info", "blah");
       header.setMustUnderstand(true);
       header.setActor(Constants.URI_SOAP12_ULTIMATE_ROLE);


       call.addHeader(header);

       Integer i = new Integer(args[0]);

       call.setOperationName("add");
       call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
       call.setReturnType(XMLType.XSD_INT);

       Integer ret = (Integer) call.invoke(new Object [] { i });
       
       System.out.println("Added " + i + ". Current total: " + ret);
   }
}

gives on error:

hugo@jibboom ~/ws-setup% java AddClientMU 2
Exception in thread "main" AxisFault
 faultCode: {http://www.w3.org/2003/05/soap-envelope}MustUnderstand
 faultSubcode:
 faultString: Did not understand "MustUnderstand" header(s):{http://example.com/he
ader}very-important-info
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace:Did not understand "MustUnderstand" header(s):{http://example.com/header}very-important-info
        at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
        at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
        at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext
.java:1087)
[…]

Triggering a mustUnderstand fault

POST /axis/MathService.jws HTTP/1.0
Content-Type: application/soap+xml; charset=UTF-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.3
Host: 127.0.0.1:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 616

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
   xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <ns1:very-important-info
     soapenv:role="http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"
     soapenv:mustUnderstand="true"
     xsi:type="xsd:string"
     xmlns:ns1="http://example.com/header">
      blah
  </ns1:very-important-info>
 </soapenv:Header>
 <soapenv:Body>
  <add soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
   <a xsi:type="xsd:int">2</a>
  </add>
 </soapenv:Body>
</soapenv:Envelope>

mustUnderstand fault

HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: application/soap+xml;charset=UTF-8
Date: Fri, 04 Nov 2005 12:38:56 GMT
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
   xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <soapenv:NotUnderstood qname="ns1:very-important-info"
   soapenv:role="http://schemas.xmlsoap.org/soap/actor/next"
   soapenv:mustUnderstand="false"
   xmlns:ns1="http://example.com/header"/>
 </soapenv:Header>
 <soapenv:Body>
  <soapenv:Fault>
   <soapenv:Code>
     <soapenv:Value>soapenv:MustUnderstand</soapenv:Value>
   </soapenv:Code>
   <soapenv:Reason>
    <soapenv:Text xml:lang="en">
      Did not understand &quot;MustUnderstand&quot; header(s):{http://example.com/header}very-important-info
    </soapenv:Text>
   </soapenv:Reason>
   <soapenv:Detail>
    <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">jibboom</ns2:hostname>
   </soapenv:Detail>
  </soapenv:Fault>
 </soapenv:Body>
</soapenv:Envelope>

SOAP 1.2 status

Addressing information: Web Services Addressing 1.0

Addressing from and to endpoints

Example of an EPR

<wsa:EndpointReference
     xmlns:wsa="http://www.w3.org/2005/04/addressing"
     xmlns:fabrikam="http://example.com/fabrikam"
     xmlns:wsdli="http://www.w3.org/2005/05/wsdl-instance"
     wsdli:wsdlLocation="http://example.com/fabrikam
       http://example.com/fabrikam/fabrikam.wsdl">
  <wsa:Address>
    http://example.com/fabrikam/acct
  </wsa:Address>
  <wsa:Metadata>
    <wsaw:InterfaceName>
      fabrikam:Inventory
    </wsaw:InterfaceName>
  </wsa:Metadata>
  <wsa:ReferenceParameters>
    <fabrikam:CustomerKey>
      412
    </fabrikam:CustomerKey>
  </wsa:ReferenceParameters>
</wsa:EndpointReference>

Message addressing properties

Example of use

Web services example

Example request message

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"      
    xmlns:wsa="http://www.w3.org/2005/03/addressing">
  <soap:Header>
    <wsa:To>
      http://example.com/fabrikam/Purchasing
    </wsa:To>
    <wsa:Action>
      http://example.com/fabrikam/SubmitPO
    </wsa:Action>
    <wsa:MessageID>
      http://example.com/6B29FC40-CA47-1067
    </wsa:MessageID>
    <wsa:RelatesTo
        RelationshipType="http://www.w3.org/2005/03/addressing/reply">
      http://example.com/fabrikam/mid/1234
    </wsa:RelatesTo>
    <wsa:ReplyTo>
      <wsa:Address>
        mailto:[email protected]
      </wsa:Address>
    </wsa:ReplyTo>
  </soap:Header>
  <soap:Body>
    …
  </soap:Body>
</soap:Envelope>

Example response message using wsa:Reply-To

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"      
    xmlns:wsa="http://www.w3.org/2005/03/addressing">
  <soap:Header>
    <wsa:To>
      mailto:[email protected]
    </wsa:To>
    <wsa:Action>
      http://example.com/fabrikam/POAcceptance
    </wsa:Action>
    <wsa:From>
      <wsa:Address>
        http://example.com/fabrikam/Purchasing
      </wsa:Address>
    </wsa:From>
    <wsa:MessageID>
      mid:[email protected]
    </wsa:MessageID>
    <wsa:RelatesTo
        RelationshipType="http://www.w3.org/2005/03/addressing/reply">
      http://example.com/6B29FC40-CA47-1067
    </wsa:RelatesTo>
  </soap:Header>
  <soap:Body>
    …
  </soap:Body>
</soap:Envelope>

WS-Addressing 1.0 status

Handling non-XML data

Optimizing transmission

Transmission issue
Transmission can be optimized
Processing issue
Base64 representation is only a logical view

XOP & MTOM

SOAP message containing binary parts

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' 
    xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'>
  <soap:Body>
    <m:data xmlns:m='http://example.org/stuff'>
      <!-- Two binary components: a photo and a signature -->
      <m:photo>/aWKKapGGyQ=</m:photo>
      <m:sig>Faa7vROi2VQ=</m:sig>
    </m:data>
  </soap:Body>
</soap:Envelope>

SOAP message packaged with MTOM

MTOM packaging

Optimized message

MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
    type="application/xop+xml";
    start="<[email protected]>";
    startinfo="application/soap+xml; action=\"ProcessData\""
Content-Description: SOAP message with my pic and sig in it

--MIME_boundary
Content-Type: application/xop+xml; 
    charset=UTF-8; 
    type="application/soap+xml; action=\"ProcessData\""
Content-Transfer-Encoding: 8bit
Content-ID: <[email protected]>

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'>
  <soap:Body>
    <m:data xmlns:m='http://example.org/stuff'>
      <!-- Two binary components: a photo and a signature -->
      <m:photo><xop:Include 
    xmlns:xop='http://www.w3.org/2004/08/xop/include' 
    href='cid:http://example.org/me.jpg'/></m:photo>
      <m:sig><xop:Include 
    xmlns:xop='http://www.w3.org/2004/08/xop/include' 
    href='cid:http://example.org/my.hsh'/></m:sig>
    </m:data>
  </soap:Body>
</soap:Envelope>

--MIME_boundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/me.jpg>

// binary octets for JPEG image

--MIME_boundary
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/my.hsh>

// binary octets for signature

--MIME_boundary--

Resource Representation SOAP Header Block

RRSHB example

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:rep='http://www.w3.org/2004/08/representation'
    xmlns:xmlmime='http://www.w3.org/2005/05/xmlmime'>
 <soap:Header>
  <rep:Representation resource='http://example.org/me.jpg'>
   <rep:Data
   xmlmime:contentType='image/jpeg'>/aWKKapGGyQ=</rep:Data>
  </rep:Representation>
 </soap:Header>
 <soap:Body>
  <x:MyData xmlns:x='http://example.org/mystuff'>
   <x:name>John Q. Public</x:name>
   <x:img src='http://example.org/me.jpg'/>
  </x:MyData>
 </soap:Body>
</soap:Envelope>

XOP/MTOM/RRSHB status

Doing something with this messaging framework

But:

Description

  1. Messaging framework
  2. Description formats
  3. Looking in the future

Describing Web services

What is WSDL 2.0?

Web service description (WSD)

WSD governing interaction between a requester agent and provider agent

WSDL 2.0 Structure

Description document:

<description targetNamespace="…">

Message formats (schema types):

  <types> … </types>

Abstract interface of the service:

  <interface>
    <operation> … </operation>*
  </interface>

Binding of these messages to a protocol:

  <binding> … </binding>

Location of the service:

  <service>
    <endpoint> … </endpoint>*
  </service>

</description>

New Features in WSDL 2.0

Inheritance

WSD A inherits from WSD B and WSD C

Extension Mechanisms

Example of open content model extensibility

Specifying that WS-Addressing 1.0 must be used:

<binding name="reservationSOAPBinding" 
    interface="tns:reservationInterface"
    type="http://www.w3.org/2005/08/wsdl/soap12"
    wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">
  <wsaw:UsingAddressing wsdl:required="true" 
        xmlns:wsaw="http://www.w3.org/2005/03/addressing/wsdl"/>
  <operation ref="tns:opCheckAvailability"
      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response" />
  <fault ref="tns:invalidDataFault" wsoap:code="soap:Sender" />
</binding>

Message Exchange Patterns (MEPs)

MEP example: In-Out

<operation name="location" wsdlx:safe="true"
           pattern="http://www.w3.org/2004/08/wsdl/in-out">
  <input element="s:location"
    style="http://www.w3.org/2005/05/wsdl/style/uri-style"/>
  <output element="s:temperature"/>
</operation>

Marking Operations as Safe

<operation name="location" wsdlx:safe="true"
           pattern="http://www.w3.org/2005/05/wsdl/in-out">
  <input element="s:location"
    style="http://www.w3.org/2005/05/wsdl/style/uri-style"/>
  <output element="s:temperature"/>
</operation>

Bindings

SOAP 1.2 Binding

SOAP 1.2 Binding Example

<binding name="SoapBinding" interface="m:CompleteInterface"
  type="http://www.w3.org/2005/05/wsdl/soap"
  wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"/>
  <!-- Use of MTOM -->
  <wsoap:module
   uri="http://www.w3.org/2004/08/soap/features/http-optimization"/>
  <operation ref="m:location"/>
  <operation ref="m:set">
    <input messageLabel="In">
      <!-- Required use of a security extension -->
      <wsoap:module required="true"
      uri="http://accurateweather.example/mySecurityExtension"/>
    </input>
    <output messageLabel="Out"/>
  </operation>
</binding>

Back to our Axis example: http://localhost:8080/axis/MathService.jws?wsdl

Only WSDL 1.1 is supported by Axis 1.3:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
    targetNamespace="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:intf="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:tns1="http://doclit"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.3
Built on Oct 05, 2005 (05:23:37 EDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://doclit" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="add">
    <complexType>
     <sequence>
      <element name="in0" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="addResponse">
    <complexType>
     <sequence>
      <element name="addReturn" type="xsd:int"/>
     </sequence>
    </complexType>
    </element>
   <element name="total">
    <complexType/>
   </element>
   <element name="totalResponse">
    <complexType>
     <sequence>
      <element name="totalReturn" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
  </schema>
 </wsdl:types>

   <wsdl:message name="totalResponse">
      <wsdl:part element="tns1:totalResponse" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="totalRequest">
      <wsdl:part element="tns1:total" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="addResponse">
      <wsdl:part element="tns1:addResponse" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="addRequest">
      <wsdl:part element="tns1:add" name="parameters"/>
   </wsdl:message>

   <wsdl:portType name="MathServiceDL">

      <wsdl:operation name="add">
         <wsdl:input message="impl:addRequest" name="addRequest"/>
         <wsdl:output message="impl:addResponse" name="addResponse"/>
      </wsdl:operation>

      <wsdl:operation name="total">
         <wsdl:input message="impl:totalRequest" name="totalRequest"/>
         <wsdl:output message="impl:totalResponse" name="totalResponse"/>
      </wsdl:operation>
   </wsdl:portType>

   <wsdl:binding name="MathServiceDLSoapBinding" type="impl:MathServiceDL">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="add">
         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="addRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="addResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>

      <wsdl:operation name="total">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="totalRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="totalResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="MathServiceDLService">
      <wsdl:port binding="impl:MathServiceDLSoapBinding" name="MathServiceDL">
         <wsdlsoap:address location="http://localhost:8080/axis/services/MathServiceDL"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

Our Axis example in WSDL 2.0: heading

<?xml version="1.0" encoding="UTF-8"?>
<description
    targetNamespace="http://localhost:8080/axis/services/MathServiceDL" 
    xmlns:tns="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:sns="http://doclit"
    xmlns="http://www.w3.org/2005/08/wsdl"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsoap="http://www.w3.org/2005/08/wsdl/soap"
    xmlns:whttp="http://www.w3.org/2005/08/wsdl/http"
    xmlns:wsdlx= "http://www.w3.org/2005/08/wsdl-extensions">

Our Axis example in WSDL 2.0: messages

   <types>
    <xsd:schema targetNamespace="http://doclit">

      <xsd:element name="total"/>

      <xsd:element name="totalResponse">
        <xsd:complexType>     
	  <xsd:sequence>      
	    <xsd:element name="totalReturn" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>

      <xsd:element name="add">
        <xsd:complexType>
	  <xsd:sequence> 
	    <xsd:element name="a" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>
            
      <xsd:element name="addResponse">
        <xsd:complexType>
	  <xsd:sequence>      
	    <xsd:element name="addReturn" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>
            
    </xsd:schema>    
   </types>

Our Axis example in WSDL 2.0: interface

   <interface name="MathService">

      <operation name="add" pattern="http://www.w3.org/2005/08/wsdl/in-out"
                       style="http://www.w3.org/2005/08/wsdl/rpc">
         <input element="sns:add"/>
         <output element="sns:addResponse"/>
      </operation>

      <operation name="total" pattern="http://www.w3.org/2005/08/wsdl/in-out"
                      wsdlx:safe="true">
         <input element="sns:total"/>
         <output element="sns:totalResponse"/>
      </operation>

   </interface>

Our Axis example in WSDL 2.0: SOAP binding

   <binding name="MathServiceSoapBinding"
            type="http://www.w3.org/2005/08/wsdl/soap"
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">

     <operation ref="add" wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"/>

     <operation ref="total" whttp:location="?method=total"
                     wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response/"/>

   </binding>

Our Axis example in WSDL 2.0: service

   <service name="MathServiceService"
            interface="tns:MathService">

     <endpoint binding="tns:MathServiceSoapBinding" name="MathEndpoint"
              address="http://localhost:8080/axis/services/MathServiceDL"/>
   </service>

</description>

Generating a Web service client from a WSDL document

hugo@jibboom ~/ws-setup% java org.apache.axis.wsdl.WSDL2Java \
http://localhost:8080/axis/services/MathServiceDL\?WSDL

hugo@jibboom ~/ws-setup% ls localhost/axis/services/MathServiceDL
MathServiceDL.class         MathServiceDLServiceLocator.class
MathServiceDL.java          MathServiceDLServiceLocator.java
MathServiceDLService.class  MathServiceDLSoapBindingStub.class
MathServiceDLService.java   MathServiceDLSoapBindingStub.java

Generating a Web service client from a WSDL document (continued)

import localhost.axis.services.MathServiceDL.*;

public class WSDLMathClientDL {
    public static void main(String[] args) {
             Integer i = new Integer(args[0]);

             try {
               MathServiceDLService service = new MathServiceDLServiceLocator();
               MathServiceDL endpoint = service.getMathServiceDL();
               int ret = endpoint.add(i);

               System.out.println("Added " + i + ". Current total: " + ret);
             } catch (Exception e) {
               System.err.println("Exception caught: " + e);
             }
    }
}

HTTP Binding

Status of the WSDL 2.0

Web Services Choreography Description Language 1.0

Presentation by Charlton Barreto, Adobe Systems Inc.

Slides

What's ahead of us

  1. Messaging framework
  2. Description formats
  3. Looking in the future

Looking into the future

Policies: constraints and capabilities

Semantics in Web services descriptions

Semantics: setting expectations

Internationalization

<env:Envelope>
 <env:Header>
  <i18n:international>
   <i18n:locale>en-US</i18n:locale>
   <i18n:preferences>
    <ldml:collation>
     <ldml:alias source="de_DE" type="phonebook"/>
    </ldml:collation>
   </i18n:preferences>
  </i18n:international>
  …
 </env:Header>
 <env:Body>
  …
 </env:Body>
</env:Envelope>

Privacy

    <operation
     name="OperationAddr" 
     pattern="http://www.w3.org/2003/11/wsdl/in-out"
     p3patt:p3p="http://example.com/p3p-pol1.xml">
      <input message="mytypes:addrUpdate"/>
      <output message="mytypes:updateResp"/>
    </operation>

References