Introduction aux services Web Exemple de PHENOPSIS DB Vincent NEGRE, vincent.negre@supagro.inra.fr JIEA 2010 1/27
Introduction aux services Web JIEA 2010 2/27
Pourquoi utiliser des services Web? Achats en ligne www. slideshare.com Interopérabilité entre systèmes et plate-formes hétérogènes. Intégration d'applications et de services. JIEA 2010 3/27
Pourquoi utiliser des services Web? Workflows en bioinformatique www.drugdiscoverytoday.com Interopérabilité entre systèmes et plate-formes hétérogènes. Intégration d'applications et de services. JIEA 2010 4/27
Définition d'un service Web Web services are loosely coupled, contracted components that communicate via XML-based interfaces. [ Schmelzer 2002] loosely coupled : - ils peuvent être changés indépendamment - ils sont indépendants de la plate-forme. Contacted : les entrées et les sorties sont décrites. Components : une interface encapsule le code XML-based interfaces : - lisibles par une machine, compréhensible par un humain. - passent les firewalls. - auto-décrits (permet la découverte de fonctionnalités). JIEA 2010 5/27
Spécifications d'un service web SOAP Simple Object Access Protocol Assure la transmission des données UDDI WSDL Universal Description, Discovery and Integration Annuaire permettant la localisation d'un service Web Web Service Description Language Description du service Web Spécifications du W3C. S'appuient sur des standards : HTTP, XML. Ces standards garantissent l'interopérabilité. JIEA 2010 6/27
Architecture orienté service 3) contacte 1) publie Fournisseur de service 2) recherche 1) publie Demandeur de service Annuaire 1) publie Fournisseur de service Fournisseur de service JIEA 2010 7/27
SOAP requête SOAP <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:phen="http://phenopsis"> <soapenv:header/> <soapenv:body> <phen:getgenotypes> <!--Optional:--> <phen:experiment>c1m7</phen:experiment> </phen:getgenotypes> </soapenv:body> </soapenv:envelope> Envelope Header Body JIEA 2010 8/27
SOAP réponse SOAP <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:body> <ns:getgenotypesresponse xmlns:ns="http://phenopsis"> <ns:return><![cdata[<?xml version="1.0" encoding="iso-8859-1"?><results plateforme="phenopsis" creation_date="mon Nov 29 14:30:47 CET 2010" provider="phenopsisws" editor="inra-lepse"> <genotypes><genotype><id>laf11-18</id><name>rilf11[ler x An-1]-18</name><function>null</function></genotype>... </ns:getgenotypesresponse> </soapenv:body> </soapenv:envelope Envelope Body Échange de données encodées en XML en utilisant HTTP comme protocole de communication. JIEA 2010 9/27
Description d'un service web avec WSDL Type <wsdl:type> définit les types de données échangées. Message <wsdl:message> Opération <wsdl:operation> Type de port <wsdl:porttype> décrit les noms et types des champs à transmettre (paramètres, valeur de retour). décrit un service (fonction). décrit un ensemble d'opérations (interface). comportant des messages en E/S. Binding <wsdl:binding> Services <wsdl:service> spécifie le protocole (SOAP). spécifie l'adresse du service. JIEA 2010 10/27
WSDL Extraits JIEA 2010 11/27
WSDL Un dialecte XML permettant de décrire des services associé à un protocole SOAP. Langage très verbeux (API amazon 1 : + de 1000 lignes de code décrivant 23 méthodes) Il serait très fastidieux de transcrire à la main un WSDL... Les outils s'en chargent! 1 : http://soap.amazon.com/schemas2/amazonwebservices.wsdl JIEA 2010 12/27
Serveur Framework GlassFish Sun Apache Tomcat Axis 2 fondation Apache IDE NetBeans Eclipse JIEA 2010 13/27
Outils SOAP-UI http://www.soapui.org/ - disponible en version standalone ou intégré dans environnements de développement (Eclipse, NetBeans, ) - multiplateforme - supporte les WS étendus (WSDL+ SOAP + UDDI) et REST - permet d'inspecter, d'invoquer des WS - permet de développer des WS - permet de simuler des WS - permet d'effectuer des tests qualités JIEA 2010 14/27
Exemple de PHENOPSIS DB JIEA 2010 14/27
PHENOPSIS Plate-forme de phénotypage d'arabidopsis Thaliana. prise d'image irrigation vue d'un plateau pesée JIEA 2010 15/27
PHENOPSIS DB 1 Système d'information permettant d'organiser: - les données : relevées micro-météos (température, humidité), mesures robots (images, humidité du sol), mesures expérimentateurs (nombre de feuilles, stade de développement,...) - les métadonnées (consignes environnementales, génotypes étudiés, description expérimentation) 1 : http://bioweb.supagro.inra.fr/phenopsis JIEA 2010 17/27
Nos web services Serveur : tomcat + axis (apache HTTP serveur en front end) IDE : NetBeans 7 méthodes publiées Publication sur BioCatalogue 1 1 : http://www.biocatalogue.com JIEA 2010 18/27
Exemple de méthode Un WS c'est un programme (Java) comme un autre! public class phenopsis { /** * Return publics experiments * @return publics experiments in format XML : String */ public String getexperiments() {... try{ conn = DriverManager.getConnection(DB_SERVER_URL, DB_USER,DB_PSW); if (isvalid(conn)){ result = transmission.executequery(requetesql); while (leresultat.next()) { String XML = XML + "<id>" + result.getstring("idmanip") + "</id>";... } } } catch (Exception e){... } finally{... } return getxml(xml); }... } JIEA 2010 19/27
Méthode pour transférer une image Pour être transférées les images sont encodées en base64. /** * Return an image * @param name of image * @return image in format XML : String */ public String getimage(string name) {... try { is = new FileInputStream(url); int bytesread = 0; int chunksize = 10000000; byte[] chunk = new byte[chunksize]; while ((bytesread = is.read(chunk)) > 0) { byte[] ba = new byte[bytesread]; for (int i = 0; i < ba.length; i++) { ba[i] = chunk[i]; } String encstr = Base64.encode(ba).toString(); retour = encstr; } } } catch (Exception e) { e.printstacktrace(); } finally {... } String XML = "<image><name>" + name + "</name><bytes64>" + retour + "</bytes64></image>"; return getxml(xml); JIEA 2010 20/27
Clients mis en place client python: #!/usr/bin/env python # -- coding: utf-8 -- from suds.client import Client url='http://bioweb.supagro.inra.fr/phenopsis/wsdl' client = Client(url) genotypes=client.service.getallgenotypes() print "Public genotypes are: " print genotypes client PHP: class FunctionsWS { var $client; var $wsdl; /* * Constructor : Created client php. */ function FunctionsWS(){ $this->wsdl='http://bioweb.supagro.inra.fr/phenopsis/wsdl'; $this->client=new soapclient($this->wsdl); } include_once("functionsws.php"); $fonctions = new FunctionsWS(); $resultshumidityxml=$fonctions->callgetobservedhumidity("an-1","c1m7"); JIEA 2010 21/27
Exemples d'applications Tracer la courbe d'humidité d'un pot : php HumidityGraph.php > graph.html include("/path_to_jpgraph/jpgraph.php"); include("/path_to_jpgraph/jpgraph_line.php"); include_once("functionsws.php"); $fonctions=new FunctionsWS(); $resultshumidityxml=$fonctions- >callgetobservedhumidity("an-1","c1m7"); /*tableau valeurs*/ $tabvaleurs=array(); $j=0; foreach($resultshumidityxml->measures[$id]->measure as $measure){ $tabvaleurs[$j]=(float)$measure->value; $j++; }... /*create graphic*/ $graph = new Graph(800,500,"auto"); $p1 = new LinePlot($tabValeurs,$dataX); $graph->add($p1); $graph->stroke('graphique.jpg'); echo "<center><img src='graphique.jpg'/></center>"; JIEA 2010 22/27
Exemples d'applications Récupérer les images d'une plante pour reconstruire sa croissance : #récupération des images du génotype LAF11-18 dans la manip C1M8 et de la répétition 1 $xmlimages=$fonctions->callgetgrowthimages("laf11-18","c1m8",1); #téléchargement et encodage en base64 $fonctions->downloadimages($xmlimages,"/tmp/"); /* * Retrieves the XML returned by getgrowthimages() in the web services. * @return XML : $xmlgrowthimages */ function callgetgrowthimages($genotype,$experiment,$repetition){... $clientgrowthimages=$this->client->getgrowthimages($parameters);... } JIEA 2010 23/27
Exemples d'applications Récupérer les images d'une plante pour reconstruire sa croissance : #récupération des images du génotype LAF11-18 dans la manip C1M8 et de la répétition 1 $xmlimages=$fonctions->callgetgrowthimages("laf11-18","c1m8",1); #téléchargement et encodage en base64 $fonctions->downloadimages($xmlimages,"/tmp/"); /* * Download function : Download the image retrieves by getimage() in web service * $urlimage : path of the image on the serveur : retrieves by getgrowthimages or getgrowthimages in <name> </name> * $path: path to download image. */ function downloadimage($urlimage,$path){... $bytes64=$xmlimage->image->bytes64;... fwrite($fichier,base64_decode($bytes64)); } > convert *.png > croissance.gif JIEA 2010 24/27
Bilan de ce projet Installation et configuration : long Codage d'une méthode, d'un client : relativement rapide Abstraction : + : masque la complexité - : accès au code source La liberté d'étudier le fonctionnement du programme, et de l'adapter à vos besoins (liberté 1). Pour ceci l'accès au code source est une condition requise. Définition d'un logiciel libre www.gnu.org JIEA 2010 25/27
Perspectives liées aux WS Sécurité (consortium OASIS : spécification WSS1 ) Versionning Gestion des Workflow (WSBPEL2, Taverna) Les WS et le web sémantique 1 : Web Service Security 2 : OASIS Web Services Business Process Execution Language JIEA 2010 26/27
Remerciements UMR MISTEA (ex MIA) : Emilie Gennari, Anne Tireau, Pascal Neveu. UMR LEPSE : Juliette Fabre, Christine Granier. EIC : Thierry Hotelier. JIEA 2010 27/27