A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL1). Other systems interact with the Web service in a manner prescribed by its description using SOAP2 messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards.D'autres définitions similaires adoptent un point de vue plus général en ne prescrivant pas l'usage exclusif de WSDL pour la description des interfaces de service ou celui de SOAP pour le traitement des messages3. Ainsi par exemple, certains auteurs proposent l'utilisation de messages XML (sans les extensions apportées par SOAP) échangés directement sur le protocole HTTP. De façon similaire, la définition officielle du consortium W3C fait spécifiquement référence au protocole HTTP, mais en pratique, d'autres protocoles sont aussi utilisés (voir Section 4.4). Une étude plus approfondie des points communs partagés par les différentes définitions et par les usages qui sont faits des services Web, permet de dégager au moins deux principes fondamentaux :
<?xml version="1.0"?> <definitions name="RecevoirBdC" targetNamespace="http://www.yothuyindi.fr:8080/exemple/fournisseur.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema/" xmlns:wns="http://www.yothuyindi.fr:8080/exemple/fournisseur.wsdl" xmlns:xsdl="http://www.yothuyindi.fr:8080/exemple/fournisseur.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">Les types de données, paramètres d'entrée et/ou de sortie sont éventuellement décrits ensuite en XMLSchema [W3C-XMLSchema ]. La description d'une commande est décrite ci-dessous comme une date et une liste non vide de produits à commander, chacun dans une quantité non nulle donnée.
<types> <schema targetNamespace="http://www.yothuyindi.fr:8080/exemple/fournisseur.xsd"> <xsd:complexType name="Commande"><xsd:sequence> <xsd:element name="dateCommande" type="xsd:date"> <xsd:element name="LigneDeCommande" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType><xsd:sequence> <xsd:element name="RéférenceProduit" type="xsd:string"/> <xsd:element name="Quantité" type="xsd:positiveInteger"/> </xsd:sequence></xsd:complexType></xsd:element> </xsd:sequence></xsd:complexType> ...</schema> </types>Vient ensuite la description de la liste des définitions des messages échangés indépendamment de l'implantation du service et du protocole utilisé. Ici, le document décrit deux messages pour l'interaction : le premier message est la requête reçue par le service, l'autre est l'accusé de réception renvoyé. Les valeurs fournies pour les attributs element sont des noms de types XML Schema ou définis dans la partie types ci-dessus.
<message name="SoumissionBdC"> <part name="body" element="xsdl:Commande"/> </message> <message name="RécépisséBdC"> <part name="body" element="xsd:string"/> </message>Les opérations offertes par le service sont exposées par le biais de points d'entrée. Un point d'entrée (élément portType) fournit la signature de chaque opération et doit par la suite être associé à une implantation particulière (voir plus loin la description de la partie binding). WSDL permet l'existence de plusieurs points d'entrée dans un même document. Ainsi, la même opération peut être rendue disponible au travers d'implantations différentes.
<portType name=pt_RecevoirBdC> <operation name="op_Commande"> <input message="wsn:SoumissionBdC"> <ouput message"=wsn:RécépisséBdC"> </operation> <operation name=... ... </portType>Dans la description ci-dessus les valeurs des attributs message font référence à un message défini plus haut (élément message du document WSDL). La définition de la signature d'une opération s'appuie sur trois sous-éléments possibles : input pour le message en entrée, output pour celui en sortie et fault pour un message d'erreur émis par le service. Les combinaisons possibles de ces sous-éléments permettent de décrire divers modèles d'opérations :
<binding name="bd_opCommande" type=pt_RecevoirBdC> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="op_Commande"> <soap:operation soapAction="http://www.yothuyindi.fr/exemple/op_Commande"/> <input> <soap:body use="literal" namespace="http://www.yothuyindi.fr/exemple/fournisseur.xsd" encodingStyle="http://schemas.xmlsoap.org/soap/encoding"/> </input> <output> <soap:body use="literal" namespace="http://www.yothuyindi.fr/exemple/fournisseur.xsd" encodingStyle="http://schemas.xmlsoap.org/soap/encoding"/> </output> </operation> </binding> <service name=ServiceFournisseur> <documentation> Service de réception des commandes </documentation> <port name="PortSoumissionCommande" binding="bd_opCommande"> <soap:address location="//www.yothuyindi.fr/exemple/fournisseur"/> </port> </service> <!-- fermeture de la balise racine --> </wsdl:definitions>Le document final est obtenu par la concaténation des extraits fournis ci-dessus. Comme le suggère l'exemple traité ici, la production de documents WSDL est un travail fastidieux dont le programmeur peut être déchargé grâce à l'utilisation d'outils pour la génération automatique de la description WSDL. Ces outils prennent en entrée la description du service sous forme d'une classe Java (ou une archive jar) ou d'un objet COM.
Lorsqu'un fournisseur reçoit un « Bon de Commande (BdC) » de la part d'un client, il doit répondre avec un « Récépissé de BdC ». Par la suite, le fournisseur enverra zéro, une ou plusieurs « Réponses à BdC » au client jusqu'à avoir donné une réponse (une acceptation ou un rejet) pour chacune des lignes du BdC. Au cours de ce processus, le fournisseur peut recevoir une « Annulation de BdC » de la part du client, dans ce dernier cas le fournisseur répond avec un « Récépissé d'Annulation de BdC ». Dès lors, le fournisseur ne doit plus envoyer de « Réponses à BdC » au client.En WSDL, il serait possible de définir chacun des messages échangés dans le protocole ci-dessus. Cependant, il ne serait pas possible d'exprimer que le fournisseur peut envoyer « plusieurs réponses à un BdC jusqu'à recevoir une annulation ». Dans des systèmes tels que CORBA, ces dépendances comportementales doivent être documentées en langue naturelle et c'est ensuite aux développeurs d'assurer que : (i) les services remplissent les contraintes exprimées dans leur documentation ; et (ii) les applications utilisent les services conformément avec leur documentation. Plusieurs initiatives de recherche, de développement et de standardisation sont en cours afin de définir des langages de description de services prenant en compte des aspects comportementaux, et d'utiliser ces descriptions « comportementales » lors du développement et de l'exécution des services. De telles initiatives s'appuient sur des résultats de recherche dans le domaine des systèmes à base de composants [Yellin and Strom 1997] et des systèmes orientés-processus [Dumas et al. 2005]. Deux efforts de standardisation dans ce domaine sont sur le point d'aboutir: le langage de description de processus métiers exécutables pour services Web (Web Services Business Process Execution Language, BPEL) [Andrews et al. 2003] et le langage de description de chorégraphies de services Web (Web Services Choreography Definition Language, WS-CDL) [Kavantzas et al. 2005]. BPEL est un langage fondé sur XML et permettant de décrire aussi bien des interfaces comportementales (au sens défini dans la section 4.2) que des orchestrations complètement exécutables. En quelques mots, BPEL permet de décrire des actions communicationnelles (envois et réceptions de message dont les types sont décrits en WSDL et XML Schema), et de lier ces actions au travers d'opérateurs de flot de contrôle (par exemple la séquence, le choix, l'itération, et les clauses throw/catch pour le traitement des exceptions). Nous montrons ci-dessous, un extrait du code BPEL correspondant à l'interface RosettaNet énoncée plus haut :
<sequence> <receive operation="BdC"/> ... <while ...> <invoke operation="reponse-a-BdC"/> </while> ... <onMessage operation="annulation-de-BdC" ...> <throw faultName="annulationEnCours"/> </onMessage> ... <catch faultName="annulationEnCours"> <invoke operation="RecepisseAnnulation-de-BdC" .../> </catch> ... </sequence>Dans cet extrait, on distingue deux types d'actions communicationnelles : receive pour la réception, et invoke pour l'envoi. Ces actions sont composées en utilisant les opérateurs de séquencement et d'itération (sequence and while) que l'on retrouve dans les langages de programmation impératifs. En outre, à tout moment (clause onMessage) un message de type annulation-de-BDC peut être reçu et alors une exception est levée et ensuite attrapée au travers des constructions throw et catch que l'on retrouve aussi dans des langages de programmation. On peut remarquer que le code BPEL ci-dessus se limite à décrire des actions communicationnelles et leurs dépendances. Si l'on voulait utiliser BPEL pour implanter le service correspondant, beaucoup plus de détails seraient nécessaires. En tant que langage d'implantation de services, BPEL est incorporé dans plusieurs outils de construction d'applications à base de services (voir Section 4.4). Cependant, en tant que langage de description d'interfaces, l'outillage autour de BPEL est presqu'inexistant. Quelques travaux de recherche montrent comment des interfaces comportementales décrites en BPEL peuvent être utilisées pour la vérification statique [Fu et al. 2004] ainsi que pour le suivi et analyse d'exécutions de services, que ce soit en temps réel [Baresi et al. 2004] ou a posteriori [Aalst et al. 2005]. Cependant, ces techniques n'ont pas encore été adoptées dans des outils commerciaux. Ce dernier commentaire s'applique également à WS-CDL, qui essaye d'aller plus loin que BPEL en s'attaquant non seulement à la description d'interfaces comportementales, mais aussi à la description de chorégraphies à différents niveaux de détails, allant de la modélisation conceptuelle jusqu'à l'implantation. L'idée de WS-CDL est que les chorégraphies décrites dans un langage semi-exécutable, peuvent être vérifiées statiquement, testées par simulation, et dans le cas des chorégraphies définies au niveau le plus détaillé elle peuvent être utilisées pour générer automatiquement les interfaces correspondant à chacun des rôles mis en jeu. A ce jour, les outils de développement de services basés sur WS-CDL sont très loin d'avoir atteint leur maturité6. Pour un aperçu et une analyse critique de WS-CDL, voir [Barros et al. 2005b].
POST /orabpel/default/Supplier HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/#axisVersion# SOAPAction: "BdC" ... <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Header> <MessageID xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:orabpel="http://schemas.oracle.com/bpel" > bpel://www.yothuyindi.fr/default/Customer~1.1/301-BpInv0-BpSeq0.3-3 </MessageID> <ReplyTo xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing"> <Address> http://GA2550:9710/orabpel/default/Customer/1.1/Supplier/SupplierRequester </Address> </ReplyTo> </soapenv:Header> <soapenv:Body> <BonDeCommande> ... </BonDeCommande> </soapenv:Body> </soapenv:Envelope>La réponse du fournisseur peut alors être envoyée au travers d'une deuxième connexion HTTP. Cette réponse doit être envoyée à l'adresse indiquée dans l'en-tête « ReplyTo » du message ci-dessus, et doit se référer à l'identificateur du message du message ci-dessus au travers de l'en-tête « RelatesTo ». Un exemple de message de réponse est donné ci-dessous:
POST /orabpel/default/Customer/1.1/Supplier/SupplierRequester HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/#axisVersion# Host: GA2550:9710 SOAPAction: "ResponseBdC" ... <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Header> <RelatesTo xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing"> bpel://www.yothuyindi.fr/default/Customer~1.1/301-BpInv0-BpSeq0.3-3 </RelatesTo> </soapenv:Header> <soapenv:Body> <ReponseBonDeCommande> ... </ReponseBonDeCommande> </soapenv:Body> </soapenv:Envelope>Pour une description relativement complète de WS-Addressing et autres spécifications WS-*, le lecteur peut se reporter à [Weerawarana et al. 2005].
<process name="ProcessusFournisseur"> <partnerLinks> <partnerLink name="client" ... /> <partnerLink name="entrepôt" ... /> </partnerLinks> <variables> <variable name="BdC" type="xsld:Commande"/> <variable name="réponseBDC" messageType= "string" /> <variable name="disponibilité" type="string"/> </variables> <sequence> <receive name="recevoirBdC" partnerLink="client" portType="pt_Commande" operation="op_Commande" variable="BdC" createInstance="yes"/> <invoke name="demanderDisponibilité" partnerLink="entrepôt" ... inputVariable="BdC" outputVariable="disponibilité"/> <switch> <case ....> <!-- cas disponible --> <!-- Initialiser la variable réponseBdC avec réponse positive --> <reply name="RépondreBdC" partnerLink="client" portType="pt_Commande" operation="op_Commande" inputVariable="réponseBDC"/> <flow> <invoke name="envoyerBordereuExpédition" .../> <receive name="recevoirOrdreDeTransfert" .../> </flow> </case> <case ...> <!-- cas indisponible --> <!-- Initialiser la variable réponseBdC avec réponse négative --> ... </case> </switch> </sequence> </process>Bien que BPEL offre des constructions spécifiques pour le développement de services Web, sa complexité pose problème. Comme le montre [Wohed et al. 2003] l'opérateur link est dans une certaine mesure redondant avec les opérateurs switch et flow dans le sens que tout processus BPEL écrit en utilisant switch et flow peut être réécrit en utilisant un seul flow et un certain nombre de links. De plus, BPEL manque d'abstractions de haut niveau lorsqu'il s'agit de développer des services qui mettent en jeu des multicasts avec des conditions de synchronisation partielles, comme par exemple dans le cas d'un service « client » qui requiert des devis de plusieurs services « fournisseurs » [Barros et al. 2005a]. On peut s'attendre à ce que dans le futur, des efforts de recherche portent sur la résolution de ces problèmes et proposent soit des extensions de BPEL, soit des langages alternatifs.