SOAP. SOAP SOAP d Apache/IBM Invocation générique : SOAP. Message XML SOAP. SOAP d Apache/IBM Invocation générique : SOAP

Full text

(1)

Web Services

Description Langage

&

SOAP

1

Services Web

IUP1 Novembre 2002

Entreprise 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 2002

Service Web ?

Envoi d’un message! Obtention d’une response Service Web I’m hungry! 3

Interfaces 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

(2)

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:

(3)

Soap

9

soap-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>

11

Request

<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>

12

(4)

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:TransferFundsRespons

e>

</soap:Body> </soap:Envelope> 13

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>

<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+xml

SOAP 1.2

(5)

Web Services

Description Langage

17 18 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

(6)

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

21

SOAP & WSDL

WSDL

IUP1 Novembre 2002

WSDL

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

(7)

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

Style 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

(8)

<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>

(9)

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

35

Editeur WSDL

Eclipse-wdt

36

(10)

37 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:body

Eléments WSDL

paramètres Interface Méthode Java XMLSchema 39

Definitions

L’élément

definitions

contient en temps

(11)

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

">

41

Types

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

43

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

(12)

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

(13)

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

50

Bindings

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

52

(14)

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>

Document-literal

53

Services

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)

(15)

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 2002

Document WSDL

Compilation Compilation Stub client Interface serveur Génération

Compilation/génération

WSDL 59

JAX-RPC

60

(16)

Servlets

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

(17)

IUP1 Novembre 2002

JAX-RPC

compilation document wsdl invocation SOAP/HTTP client transport JAX-RPC runtime JAX-RPC API invocation Stub client

AXIS-JAX-RPC

AXIS +

65

AXIS

66

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. Direcotry Structure: axis-1_0 docs lib webapps samples axis WEB-INF lib classes web.xml …… 67

Compilation WSDL

68

(18)

Stubs

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

(19)

Diagramme d’usage

73

XSD + portType

«wsdl:portType» stereotype

Stereotype 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 wsdl

(20)

Diagramme 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

79

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 )

!!!!} }

(21)

!<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

81

Développement

82

Développement depuis

l’UML

83

Impl2wsdl

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

(22)

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:

(23)

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

Figure

Updating...

References

Updating...

Related subjects :