Service Web? Web Services Description Langage & SOAP Service Web? Envoi d un message! Service Web? I m hungry! Service Web Obtention d une response IUP1 Novembre 2002 1 Services Web Interfaces Services web Entreprise Web Services JAX-RPC Stub Client The Internet Inter-Network SOAP/HTTP Google, Amazon, ebay,... possédent RMI/IIOP SOAP Router JAX-RPC runtime Web container 3 aussi une interface service web permettant de les accéder par programme et d échanger des types complexes Service EJB EJB container RMI Local network IUP1 Novembre 2002 2 4
05/09/2001 SOAP SOAP d Apache/IBM Invocation générique : SOAP 36 05/09/2001 SOAP SOAP d Apache/IBM Invocation générique : SOAP 42 ",-./) ",-./) 7#$7,8)'59'5:%') 7#$7,8)'59'5:%') $%&'()!""# *#*$!+ 9'5:&.'6 $%&'()!""# *#*$!+ 9'5:&.'6 SOAP, D. Donsez, 2000-2001 "5/(64,5) ;83-'66/<' 9=*# 01234/56'5 SOAP, D. Donsez, 2000-2001 ;-&66&,( <'3%/35=4,(6' 01234/56'5 5 7 SOAP Message XML 05/09/2001 SOAP, D. Donsez, 2000-2001 SOAP d Apache/IBM Invocation générique : SOAP $%&'()!""# *#*$!+ ;(:,./)&,(3 <836'5:&.' ",-./) 7#$7,8)'59'5:%') 01234/56'5 9'5:&.'6 40 Les données ne sont plus codées dans une url, mais dans un dialecte XML: http://www.w3.org/2003/05/soap-envelope <SOAP-ENV: Body> <s:searchrequest xmlns:s= www.xmlbus.com/searchservice > <p1>rando</p1> <p2>etendard</p2> </s:searchrequest> </SOAP-ENV:Body> 6 8
Soap 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> 9 11 http://www.w3.org/2002/12/soap-envelope soap-envelope 1.2 Request <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> <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> 10 12
Response <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> GML Messages XML Messages XML Application DCM RPC document xml API de programmation Messages SOAP Transport HTTP SMTP JMS IUP1 Novembre 2002 13 15 Soap 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> SOAP 1.2 application/soap+xml HTTP Binding <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> 14 16
Web Services Description Langage 17 19 WSDL 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 18 20
WSDL et les messages XML? WSDL XMLSchema http://schemas.xmlsoap.org/wsdl WSDL est définit par un schéma XML (wsdl.xsd) WSDL établit de contraintes de type schéma sur les messages XML Schema element type targetnamespace name xmlns complextype sequence simpletype restriction enumeration WSDL est défini à partir De XMLSchema definitions types operation porttype message port part input binding output service IUP1 Novembre 2002 21 23 SOAP & WSDL WSDL:UML 22 24
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 25 <types> <schema> Style: <element name="mymethod"> document/literal <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> 27 Style document Types <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> 26 28
Messages Binding? <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> <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> 29 31 PortType Service <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> <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> 30 32
WSDL: Temperature Style RPC/encoded ou RPC/literal <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> 33 35 <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> Eclipse-wdt Editeur WSDL <wsdl:message name="emptymessage"/> <wsdl:message name="messagetemperature"> <wsdl:part name="arg1" type="xsd1:temperature"/> </wsdl:message> 34 36
Eléments WSDL definitions XMLSchema types messages messages Java paramètres part Interface porttype operation Méthode input binding output soap:binding operation GML soap:operation service port input soap:body output soap:body soap:adress IUP1 Novembre 2002 37 Definitions Eléments WSDL definitions 39 types messages messages part porttype L élément definitions contient en temps qu attributs la liste des espaces de noms utilisés operation input binding output soap:binding operation GML soap:operation service port input soap:body output soap:body soap:adress IUP1 Novembre 2002 38 40
Definitions Style RPC Types <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"> <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> 41 43 Types Définitions de types indépendantes d un langage: utilisation de XML-Schema 42 Style 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 Style rpc Messages <wsdl:message name="emptymessage"/> <wsdl:message name="messagetemperature">!!!!!!!!<wsdl:part name="arg1" type="xsd1:temperature"/> </wsdl:message> <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> 45 47 Messages Style document Messages Contiennent les paramètres des fonctions: in/out <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> 46 48
PortTypes Bindings Se réfèrent aux définitions des messages pour décrire les signatures des fonctions Spécifie le binding de chaque opération de la section PortTypes: RPC-literal, RPC-encoded ou Document literal 49 51 RPC PortType <porttype name="temperatureporttype"> <operation name="gettemperature"> <input message="tns:emptymessage"/> <output message="tns:messagetemperature"/> </operation> </porttype> Document <porttype name="searchphonesporttype"> <operation name="search"> <input message="tns:searchrequest" name="searchrequest"/> <output message="tns:searchresponse" name="searchresponse"/> </operation> </porttype> RPCencoded 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> 50 52
Documentliteral Binding <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> Service <service name="myservice"> <port name="mywsdlport" binding="tns:mywsdlbinding"> <soap:address location="http://localhost:8000/ccx/myservice"/> </port> </service> <wsdl:service name="searchphonesservice"> <wsdl:port binding="tns:searchphonesbinding"name="searchphonesservice"> <soap:address location="http://localhost:8080/webservices/server"/> </wsdl:port> </wsdl:service> 53 55 Services Spécifie l url du port de chaque binding, mais ne donne pas l opération à effectuer: Exemple http://localhost:8000/ccx/soapaction Pattern Proxy Things can be new things when someone writes a proxy (Ken Arnold) 54 56
Pattern proxy Un proxy contrôle l accés à un service. Les situation les plus courantes sont: Virtual Proxy réalisant un création progressive d objets côuteux Protection Proxy réalisant un contrôle d accés Remote Proxy donnant accés à un service distant Compilation/génération Document WSDL WSDL Compilation Compilation Génération Interface serveur Stub client IUP1 Novembre 2002 57 59 Remote Proxy Pattern Using the Remote Proxy Pattern JAX-RPC Service API Client Service 17 IUP1 Novembre 2002 58 60
Servlets AXIS: serveur 61 63 Apache Axis JAX-RPC 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) 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 62 64
AXIS-JAX-RPC client AXIS + JAX-RPC compilation invocation document wsdl Installation & 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. webapps axis WEB-INF lib Direcotry Structure: lib classes web.xml axis-1_0 docs samples invocation JAX-RPC API JAX-RPC runtime transport Stub client SOAP/HTTP IUP1 Novembre 2002 65 67 AXIS Compilation WSDL 66 68
Stubs Stubs RPC-encoded <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> AXIS: Client Cette classe implémente l interface AddressBookservicePoint public class AddressBookClient { IUP1 Novembre 2002 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); } } 69 71 AXIS: client Service Temperature TemperatureService service = new TemperatureServiceLocator(); TemperaturePortType port = service.gettemperatureport(); // Make the actual call with Austin zipcode System.out.println("temperature = " + port.gettemp("78765")); Design d un service web 70 72
Diagramme d usage xsd+porttype+port «wsdl:port» stereotype uri partielle du port Collaboration avec les classes du domaine de modélisation 73 75 XSD + porttype Diagramme complet espace de nom wsdl «wsdl:porttype» stereotype Stereotype encapsulant operations, messages & parts «wsdl:service» stereotype uri partielle du service 74 76
Diagramme sequence 77 Example <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> 79 XSLT pour WSDL PrettyPrint?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 )!!!!} } 78 80
<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!<wsdl:portType name="mywsdlporttype"> Développement depuis l UML!!!!!!!!<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> 81 83 Impl2wsdl Développement 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 82 84
WDSL-First Pertes lors d une transformation Approche recommandée pour des services exposés sur l internet Qui est qui? 85 87 Comparaison WXS avancé Pourquoi exprimer la sématique du service avec autre chose? 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 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: lists, unions, disjunctions, restricted complex types 86 88
Dans la pratique 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é 89 XSD2WebService 90