Web Services
Description Langage
&
SOAP
1Services Web
IUP1 Novembre 2002Entreprise Web Services
Client Web container
Local network Inter-NetworkThe Internet
SOAP/HTTP JAX-RPC Stub
RMI
RMI/IIOP JAX-RPC runtime Service EJB
SOAP Router EJB container 2
Service Web ?
Service Web ? IUP1 Novembre 2002Service Web ?
Envoi d’un message! Obtention d’une response Service Web I’m hungry! 3Interfaces Services
web
•
Google, Amazon, eBay, ... possédent aussi
une interface service web permettant de
les accéder par programme et d’échanger
des types complexes
SOAP
05/09/2001 S O A P , D . D o n s e z , 2 0 0 0 -2 0 0 1 36 !""#SOAP d’Apache/IBM
Invocation générique : SOAP
$%&'() * # * $ ! + ",-./) 01234/56'5 7#$7,8)'59'5:%') 9 '5: &. '6 "5/(64,5) ;83-'66/<' 9=*# 5
SOAP
05/09/2001 S O A P , D . D o n s e z , 2 0 0 0 -2 0 0 1 40 !""#SOAP d’Apache/IBM
Invocation générique : SOAP
$%&'() * # * $ ! + ",-./) 01234/56'5 7#$7,8)'59'5:%') 9 '5: &. '6 ;(:,./)&,(3 <836'5:&.'
SOAP
05/09/2001 S O A P , D . D o n s e z , 2 0 0 0 -2 0 0 1 42 !""#SOAP d’Apache/IBM
Invocation générique : SOAP
$%&'() * # * $ ! + ",-./) 01234/56'5 7#$7,8)'59'5:%') 9 '5: &. '6 ;-&66&,( <'3%/35=4,(6' 7
Message XML
<
SOAP
-ENV: Body>
<s:searchRequest xmlns:s=“www.xmlbus.com/searchService”>
<p1>rando</p1>
<p2>etendard</p2>
</s:searchRequest>
</SOAP-ENV:Body>
Les données ne sont plus codées dans une url,
mais dans un dialecte XML:
Soap
9soap-envelope 1.2
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2002/12/soap-envelope" targetNamespace="http://www.w3.org/2002/12/soap-envelope elementFormDefault="qualified" ><xs:element name="Envelope" type="tns:Envelope" /> <xs:complexType name="Envelope" >
<xs:sequence>
<xs:element ref="tns:Header" minOccurs="0" /> <xs:element ref="tns:Body" minOccurs="1" /> </xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax" /> </xs:complexType> http://www.w3.org/2002/12/soap-envelope 10
Exemple
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<
soap:Header
> <!-- optional -->
<!-- header blocks go here... -->
</
soap:Header
>
<
soap:Body
>
<!-- payload or Fault element goes here... -->
</
soap:Body
>
</soap:Envelope>
11Request
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<
soap:Body
>
<x:TransferFunds xmlns:x="urn:examples-org:banking">
<from>22-342439</from>
<to>98-283843</to>
<amount>100.00</amount>
</x:TransferFunds>
</
soap:Body
>
</soap:Envelope>
12Response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <x:TransferFundsResponse xmlns:x="urn:examples-org:banking"> <balances> <account> <id>22-342439</id> <balance>33.45</balance> </account> <account> <id>98-283843</id> <balance>932.73</balance> </account> </balances> </x:TransferFundsResponse>
</soap:Body> </soap:Envelope> 13Soap 1.2
<xs:element name="Header" type="tns:Header" /> <xs:complexType name="Header" ><xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax" /> </xs:complexType>
<xs:element name="Body" type="tns:Body" /> <xs:complexType name="Body" > <xs:sequence>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax" /> </xs:complexType>
Messages XML
IUP1 Novembre 2002
Messages XML
SOAP
document xml API de programmation
HTTP Transport GML Application SMTP JMS RPC DCM Messages 15
HTTP Binding
application/soap+xmlSOAP 1.2
Web Services
Description Langage
17 18 19WSDL
WSDL est un langage xml pour décrire des services
réseaux comme des ensembles de points terminaux
opérants sur des messages contenant de l’information type
document ou procédurale.
Les opérations et les messages sont décrits de manière
abstraite, puis liés à un protocole réseau concret.
WSDL se veut extensible par rapport au format des
messages et aux types de protocoles
WSDL et les messages
XML?
•
WSDL est définit par un schéma XML
(wsdl.xsd)
•
WSDL établit de contraintes de type schéma sur
les messages XML
21SOAP & WSDL
WSDL
IUP1 Novembre 2002WSDL
WSDL est défini à partir De XMLSchema Schema element type name targetNamespace simpleType restriction complexType enumeration sequence xmlns definitions types message XMLSchema http://schemas.xmlsoap.org/wsdl part binding portType service port operation output input 23
WSDL:UML
Style document/literal
•
le corps du message soap contient
uniquement un document valide
•
l’information sur le destinataire se trouve
dans un header soap
•
l’information sur l’opération est codée
implicitement dans le nom des éléments
globaux du schéma
25Style document
26 <types> <schema><element name="myMethod"> <complexType>
<sequence>
<element name="x" type="xsd:int"/> <element name="y" type="xsd:float"/> </sequence>
</complexType> </element>
<element name="myMethodResponse"> <complexType/>
</element> </schema> </types>
<message name="myMethodRequest">
<part name="parameters" element="myMethod"/> </message>
<message name="empty">
<part name="parameters" element="myMethodResponse"/> </message>
<portType name="PT">
<operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType>
document/literal
Style:
27 <wsdl:types><s:schema elementFormDefault="qualified" targetNamespace="ZipCode"> <s:element name="LocalTimeByZipCode">
<s:complexType> <s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="LocalTimeByZipCodeResponse"> <s:complexType> <s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="LocalTimeByZipCodeResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types>
Types
28<wsdl:message name="LocalTimeByZipCodeIn">
<wsdl:part name="parameters" element="tns:LocalTimeByZipCode" /> </wsdl:message> <wsdl:message name="LocalTimeByZipCodeOut"> <wsdl:part name="parameters" element="tns:LocalTimeByZipCodeResponse" /> </wsdl:message>
Messages
29<wsdl:portType name="LocalTime">
<wsdl:operation name="LocalTimeByZipCode">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> Returns the local time for a given zip code.
</wsdl:documentation> <wsdl:input message="tns:LocalTimeByZipCodeIn" /> <wsdl:output message="tns:LocalTimeByZipCodeOut" /> </wsdl:operation> </wsdl:portType>
PortType
<wsdl:binding name="LocalTimeSoap" type="tns:LocalTime"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="LocalTimeByZipCode">
<soap:operation soapAction="ZipCodeResults/LocalTimeByZipCode" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
Binding
?
31 <wsdl:service name="LocalTimeService"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> Provides local time for supplied zip code.</wsdl:documentation>
<wsdl:port name="LocalTime" binding="tns:LocalTimeSoap">
<soap:address location="http://www.ripedev.com/webservices/LocalTime.asmx" /> </wsdl:port>
</wsdl:service>
Style RPC/encoded
ou
RPC/literal
33
<wsdl:definitions name="tempService" targetNamespace="temperature.wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="temperature.wsdl" xmlns:xsd1="temperature"> <wsdl:types>
<xsd:schema targetNamespace="temperature" elementFormDefault="qualified"> <xsd:complexType name="Temperature"> <xsd:sequence>
<xsd:element name="min" type="xsd:double"/> <xsd:element name="max" type="xsd:double"/> </xsd:sequence>
</xsd:complexType> </xsd:schema> </wsdl:types>
<wsdl:message name="EmptyMessage"/> <wsdl:message name="MessageTemperature"> <wsdl:part name="arg1" type="xsd1:Temperature"/> </wsdl:message>
34
<wsdl:portType name="TemperaturePortType"> <wsdl:operation name="getTemperature"> <wsdl:input message="tns:EmptyMessage"/> <wsdl:output message="tns:MessageTemperature"/> </wsdl:operation>
</wsdl:portType>
<wsdl:service name="temperature">
<wsdl:port name="TemperaturePort" binding="tns:TempBinding"> <soap:address location="http://localhost:8000/ccx/temperature"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
WSDL: Temperature
35Editeur WSDL
Eclipse-wdt
3637 IUP1 Novembre 2002 GML definitions types messages service messages part portType operation output input binding operation soap:binding output input soap:operation port soap:adress soap:body soap:body
Eléments WSDL
IUP1 Novembre 2002 GML definitions types messages service messages part portType operation output input binding operation soap:binding output input soap:operation port soap:adress soap:body soap:bodyEléments WSDL
paramètres Interface Méthode Java XMLSchema 39Definitions
L’élément
definitions
contient en temps
Definitions
<
wsdl:definitions
name
="
temperature
"
targetNamespace
="
temperature.wsdl
"
xmlns:wsdl
="
http://schemas.xmlsoap.org/wsdl/
"
xmlns:soap
="
http://schemas.xmlsoap.org/wsdl/soap/
"
xmlns:xsd
="
http://www.w3.org/2001/XMLSchema
"
xmlns:tns
="
temperature.wsdl
"
xmlns:xsd1
="
temperature
">
41Types
Définitions de types indépendantes d’un langage:
utilisation de XML-Schema
42
Types
<wsdl:types>
<xsd:schema targetNamespace="temperature" elementFormDefault="qualified">
!!!!!!!!!!!!<xsd:complexType name="Temperature">
!!!!!!!!!!!!!!!!<xsd:sequence>
!!!!!!!!!!!!!!!!!!!!<xsd:element name="min" type="xsd:double"/>
!!!!!!!!!!!!!!!!!!!!<xsd:element name="max" type="xsd:double"/>
!!!!!!!!!!!!!!!!</xsd:sequence> !!!!!!!!!!!!</xsd:complexType> !!!!!!!!</xsd:schema> !!!!</wsdl:types>
Style RPC
43Style document
<wsdl:types> <xsd:schema targetNamespace="http://ibm.com/j2g/webservices/types"> <xsd:complexType name="PersonPhone"> <xsd:sequence><xsd:element name="personName" type="xsd:string"/> <xsd:element name="phoneNumber" type="xsd:string"/> </xsd:sequence>
</xsd:complexType> <xsd:element name="search"> <xsd:complexType> <xsd:sequence>
<xsd:element name="personName" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="searchResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="unbounded" name="personPhone" type="types:PersonPhone"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> 44
Style document
45
Messages
Contiennent les paramètres des fonctions:
in/out
Messages
<message name="updateAddressRequest"> <part name="in0" type="tns:Address"/> <part name="in1" type="xsd:int"/> </message>
<message name="updateAddressResponse"> <part name="return" type="xsd:string"/> </message>
<wsdl:message name="EmptyMessage"/> <wsdl:message name="MessageTemperature">
!!!!!!!!<wsdl:part name="arg1" type="xsd1:Temperature"/> </wsdl:message>
Style rpc
47
Messages
<wsdl:message name="searchRequest">
<wsdl:part name="parameters" element="
types:search
"/>
</wsdl:message>
<wsdl:message name="searchResponse">
<wsdl:part name="result" element="types:searchResponse" />
</wsdl:message>
Style
document
PortTypes
Se réfèrent aux définitions des messages pour décrire
les signatures des fonctions
49
PortType
<portType name="SearchPhonesPortType"> <operation name="search">
<input message="tns:searchRequest" name="searchRequest"/> <output message="tns:searchResponse" name="searchResponse"/> </operation> </portType> <portType name="TemperaturePortType"> <operation name="getTemperature"> <input message="tns:EmptyMessage"/> <output message="tns:MessageTemperature"/> </operation> </portType>
RPC
Document
50Bindings
Spécifie le binding de chaque opération de la section
PortTypes:
RPC-literal, RPC-encoded ou Document literal
51
Binding
<binding name="AddressSoapBinding" type="tns:AddressBookService"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="updateAddress">
<soap:operation soapAction="soapUpdateAddress"/> <input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://wiki/Address" use="encoded"/>
</input> <output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://wiki/Address" use="encoded"/>
</output> </operation> </binding>
RPC-encoded
52Binding
<wsdl:binding name="SearchPhonesBinding" type="tns:SearchPhonesPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="search"> <soap:operation soapAction=""/> <wsdl:input>
<soap:body use="literal"/>
</wsdl:input> <wsdl:output>
<soap:body use="literal"/>
</wsdl:output> </wsdl:operation> </wsdl:binding>
Document-literal
53Services
Spécifie l’url du port de chaque binding, mais ne
donne pas l’opération à effectuer:
Exemple
http://localhost:8000/ccx/SOAPAction
Service
<wsdl:service name="SearchPhonesService">
<wsdl:port binding="tns:SearchPhonesBinding"name="SearchPhonesService"> <soap:address location="http://localhost:8080/webservices/server"/> </wsdl:port>
</wsdl:service>
<service name="MyService">
<port name="MyWSDLPort" binding="tns:MyWSDLBinding"> <soap:address location="http://localhost:8000/ccx/myService"/> </port>
</service>
55
Pattern Proxy
Things can be new things when someone writes a proxy
(Ken Arnold)
Pattern proxy
•
Un proxy contrôle l’accés à un service. Les
situation les plus courantes sont:
•
Remote Proxy
donnant accés à un service distant
•
Virtual Proxy
réalisant un création progressive
d’objets côuteux
•
Protection Proxy
réalisant un contrôle d’accés
57
Remote Proxy Pattern
IUP1 Novembre 2002
Using the Remote Proxy Pattern
Service Service API 17 Client 58 IUP1 Novembre 2002Document WSDL
Compilation Compilation Stub client Interface serveur GénérationCompilation/génération
WSDL 59JAX-RPC
60Servlets
61
Apache Axis
• A SOAP Processing Engine • JAX-RPC Client System
• JAX-RPC Server System ( Servlet based ) • SAAJ implementation
• Flexible and extensible architecture • Tools, Examples, Documentation, … • A great place to learn about Web Services !! • Open-source, hosted by Apache Software Foundation • Ready for use ( RC1 released on Sep. 6)
AXIS: serveur
63
JAX-RPC
• WSDL/XML to Java Mapping • Java to WSDL/XML Mapping • SOAP Message with Attachments • Client API• Classes generated from WSDL • Dynamic Proxy
• DII call Interface • SOAP Message Handler • Extensible Type Mapping
IUP1 Novembre 2002
JAX-RPC
compilation document wsdl invocation SOAP/HTTP client transport JAX-RPC runtime JAX-RPC API invocation Stub clientAXIS-JAX-RPC
AXIS +
65AXIS
66Installation & Deployement d’ Axis
• Make sure that you have• J2SE SDK 1.3 or 1.4: We will use 1.4 • A Servlet Container: We will use Tomcat4.0.1 • Download xml-axis-rc1-bin.zip from
http://xml.apache.org/axis
• Unzip it and look at the dir. tree. Note that Axis runs as a Servlet.
• Deploy Axis.
• Copy webapps\axis tree to webapps
directory of Tomcat.
• Alternatively, modify server.xml of Tomcat. • Run Tomcat: issue bin\startup from Tomcat
home. Direcotry Structure: axis-1_0 docs lib webapps samples axis WEB-INF lib classes web.xml …… 67
Compilation WSDL
68Stubs
IUP1 Novembre 2002
Stubs
69
AXIS: client
TemperatureService service = new TemperatureServiceLocator();
TemperaturePortType port = service.getTemperaturePort(); // Make the actual call with Austin zipcode
System.out.println("temperature = " + port.getTemp("78765"));
Service Temperature
AXIS: Client
public class AddressBookClient {public static void main(String[] args) {
AddressBookServicePoint service = new AddressBookServicePointLocator(); AddressBookService abs = service.getAddressBookService();
Address adr= new Address(); adr.setStreet("rue des fleurs"); adr.setPostcode(38240); String s = abs.updateAddress(adr,1);
} }
<message name="updateAddressRequest"> <part name="in0" type="tns:Address"/> <part name="in1" type="xsd:int"/> </message>
<message name="updateAddressResponse"> <part name="return" type="xsd:string"/> </message>
Cette classe implémente l’interface AddressBookservicePoint
RPC-encoded
71
Design d’un service
web
Diagramme d’usage
73
XSD + portType
«wsdl:portType» stereotypeStereotype encapsulant operations, messages & parts
74
xsd+portType+port
uri partielle du port «wsdl:port» stereotype
Collaboration avec les classes du domaine de modélisation
75
«wsdl:service» stereotype
uri partielle du service
Diagramme complet
espace de nom wsdlDiagramme sequence
77
XSLT pour WSDL
<definitions name="StockQuote" targetNamespace="http://example.com/stockquote/definitions">
!!!!<import namespace="http://example.com/stockquote/schemas"location="http://example.com/ stockquote/stockquote.xsd">
!!!!</import>
!!!!<message name="GetLastTradePriceInput">
!!!!!!!!<part name="body" element="xsd1:TradePriceRequest">
!!!!!!!!</part>
!!!!</message>
!!!!<message name="GetLastTradePriceOutput">
!!!!!!!!<part name="body" element="xsd1:TradePrice">
!!!!!!!!</part>
!!!!</message>
!!!!<portType name="StockQuotePortType">
!!!!!!!!<operation name="GetLastTradePrice">
!!!!!!!!!!!!<input message="tns:GetLastTradePriceInput">
!!!!!!!!!!!!</input>
!!!!!!!!!!!!<output message="tns:GetLastTradePriceOutput">
!!!!!!!!!!!!</output> !!!!!!!!</operation> !!!!</portType> </definitions>
Example
79PrettyPrint
?xml version="1.0"?> <?xml-stylesheet href="http://www.capescience.com/simplifiedwsdl.xslt" type="text/xsl"?> <wsdl:definitions ....definitions StockQuote targetNamespace http://example.com/stockquote/definitions
{
!!!!import http://example.com/stockquote/schemas from http://example.com/stockquote/
schemas
!!!!message GetLastTradePriceInput
!!!!{
!!!!!!!!part body type xsd1:TradePriceRequest
!!!!}
!!!!message GetLastTradePriceOutput
!!!!{
!!!!!!!!part body type xsd1:TradePrice
!!!!}
!!!!portType StockQuotePortType
!!!!{
!!!!!!!!tns:GetLastTradePriceOutput!GetLastTradePrice ( tns:GetLastTradePriceInput )
!!!!} }
!<wsdl:portType name="MyWSDLPortType"> !!!!!!!!<wsdl:operation name="setTemperature"> !!!!!!!!!!!!<wsdl:input message="tns:MessageTemperature"/> !!!!!!!!!!!!<wsdl:output message="tns:EmptyMessage"/> !!!!!!!!</wsdl:operation> !!!!!!!!<wsdl:operation name="getTemperature"> !!!!!!!!!!!!<wsdl:input message="tns:EmptyMessage"/> !!!!!!!!!!!!<wsdl:output message="tns:MessageTemperature"/> !!!!!!!!</wsdl:operation> !!!!!!!!<wsdl:operation name="echoTemperature"> !!!!!!!!!!!!<wsdl:input message="tns:MessageTemperature"/> !!!!!!!!!!!!<wsdl:output message="tns:MessageTemperature"/> !!!!!!!!</wsdl:operation> !!!!</wsdl:portType> <xsd:complexType name="Temperature"> <xsd:sequence>
<xsd:element name="min" type="xsd:double"/> <xsd:element name="max" type="xsd:double"/> </xsd:sequence> </xsd:complexType>
XSD vers WSDL
81Développement
82Développement depuis
l’UML
83Impl2wsdl
Le programmer du service est l’autorité ultime qui
définit la sémantique du service
ok, pour un intranet à l’intérieur d’une compagnie
WDSL-First
Approche recommandée pour
des services exposés sur l’internet
85
Comparaison
Avec WSDL first, toutes les transformations partent d’un
même document et XML-schema est le modèle de type le
plus puissant actuellement
Avec Impl2wsdl, les transformations se font en série, dans
différentes directions in et out
Pourquoi exprimer la sématique du service avec autre chose?
Pertes lors d’une
transformation
Qui est
qui?
87
WXS avancé
Impossibilé du mapping des caractéristiques
avamcées de WXS ?
Flyweight classes in Java pour représenter les types
enumérés. Dans l’approche Java2WSDL, impossibilité
de les utiliser sauf à les créer à la main
Autres exemples:
•
Le schema définit le format de sérialisation
•
Création du WSDL à partir du schéma
•
Limitations à l’usage des caractéristiques
avancées de XML-Schema suivant le
moteur SOAP utilisé
Dans la pratique
89
XSD2WebService