Standardy pro Webové služby WSDL, UDDI 1 Karel Richta Katedra počítačů FEL ČVUT Karlovo nám.13, 121 35 Praha 2 Tel: 2 2435 7319 e-mail: richta@fel.cvut.cz www: http://cs.felk.cvut.cz/~richta Klíčová slova: WSDL, UDDI, XML, XSL, XSLT, SOAP Abstrakt: Příspěvek se zabývá standardy WSDL (Web Services Description Language) a UDDI (Universal Description, Discovery and Integration), které byly vytvořeny pro popis a hledání tzv. webových služeb. Z popisu služby ve WSDL lze automaticky vygenerovat kód, kterým tuto službu zavoláme (ve formátu SOAP), i kostru programové obsluhy této služby. Univerzální registr UDDI by měl posloužit pro vyhledání vhodné služby. 1 Úvod Formát XML (extensible Markup Language) již pronikl mezi odbornou veřejnost jako nástroj pro reprezentaci strukturovaných a semistrukturovaných dat, tj. nástroj pro universální přenos dokumentů. Konsorcium W3C (World Wide Web Consortium) v současné době podporuje řadu dalších formátů, které z XML vycházejí tzv. aplikace XML. Jednou takovou aplikací je i standard pro tzv. webové služby služby poskytované prostřednictvím sítě. Jako příklad takové služby může posloužit služba pro zjištění aktuálního kurzu akcie ve vzdáleném místě. Pokud mají být takové služby nezávislé na platformě a být dostupné zcela globálně, je výhodné využít pro jejich reprezentaci formát XML. Požadavek na službu zakódujeme do XML a přeneseme pomocí protokolu HTTP na cílový stroj. Tam je požadavek rozkódován, obsloužen a získané výsledky opět přeneseny zpět ve formátu XML. Volání služeb ve vzáleném místě lze formulovat a přenášet pomocí protokolu SOAP (Simple Object Access Protocol), který slouží pro obecné vyvolávání metod vzdálených objektů. Aby ale klient věděl, jak službu vzdáleného objektu vyvolat, musí znát její interface - funkční profil. Pro jejich zápis byl definován standard WSDL (Web Services Description Language). Z popisu služby ve WSDL lze automaticky vygenerovat kód, kterým tuto službu zavoláme (ve formátu SOAP), i kostru programové obsluhy této služby. Poslední související problém je, jak zjistit, které služby se v síti nabízí. K tomu by měl posloužit univerzální registr obsahující seznam a popis dostupných webových služeb, tzv. UDDI (Universal Description, Discovery and Integration). V takovém registru by mělo být možné službu vyhledat, podle jejího popisu ve WSDL zformulovat zprávu ve formátu SOAP a nechat se vzdáleným poskytovatelem obsloužit. Příspěvek se zabývá právě formáty WSDL a UDDI a jejich využitím. 1 Tento článek vznikl při práci na výzkumném záměru č. MSM 212300014 Výzkum v oblasti informačních technologií a komunikací MŠMT a při práci sponzorované grantem GAČR č. 201/03/0912 Vyhledávání a indexování XML dokumentů. 1
2 Co to jsou webové služby? Základem tzv. webových služeb je formát XML a protokol HTTP. HTTP je protokol, který je akceptován pravděpodobně všude na Internetu. XML představuje metajazyk, ve kterém lze vytvářet rozmanité specializované jazyky (nazývané aplikace XML) tím, že definujeme určitou sadu přípustných značek a jejich možné kombinace. Takovou aplikací je i formát WSDL (Web Services Description Language [WSDL 03]). Definuje požadovanou strukturu XML-dokumentu, který charakterizuje určitou službu přístupnou prostřednictvím sítě. Podobně i žádost o vykonání této služby je zformulována jako XML dokument, tentokrát pomocí jiné aplikace XML nazývané SOAP (Simple Object Access Protocol [SOAP 02]). Formát SOAP slouží jako obálka pro žádost o provedení služby i pro navracené údaje. Žádost o provedení služby přenesená do cílového místa ve formátu XML je rozkódována a převedena na vyvolání potřebné služby. Její výstupy jsou pak opět zabaleny do XML a přeneseny zpět. Celá situace připomíná infrastrukturu podobnou např. standardu CORBA (Common Object Request Broker Architecture), vzdálenému volání procedur a formátu IDL (Interface Definition Language). Tento standard byl navržen právě pro možnost vytvářet distribuované aplikace nezávislé na konkrétním prostředí jednotlivých uzlů. Skutečná situace však většinou není tak jednoduchá, zatímco protokol HTTP je akceptován téměř všude. Poskytované služby je třeba někde inzerovat. Pro tento účel je zaveden jakýsi registr dostupných služeb nazývaný UDDI (Universal Description, Discovery and Integration Service [UDDI 02]). Ten by měl posloužit pro vyhledání potřebné služby a nalezení jejího popisu ve formátu WSDL. Podle něj pak lze službu vyvolat. Existují též pokusy o další rozšíření těchto technologií, jako např. XAML (Transaction Authority Markup Language), XLANG (podpora pro řízení transakcí realizovaných prostřednictvím webových služeb), nebo XKMS (XML Key Management Specification). Ty však zatím nejsou obecně akceptovány. 2
3 Struktura dokumentu ve WSDL Dokument ve formátu WSDL představuje sadu definic zahrnutých do elementu wsdl:definitions. Jeho podrobná struktura je uvedena v příloza A. Zjednodušená gramatika pro tento element je znázorněna na následujícím obrázku: Služby jsou definovány pomocí 4 základních elementů: message abstraktní definice přenášených dat, skládá se z částí (parts), porttype představuje sadu abstraktních operací, které mají definován vstup, výstup a reakci na chyby, binding popisuje konkrétní protokol pro navázání operace na složky operace popsané pomocí porttype, service odkazuje na uzel který službu realizuje a pomocí složek port odkazuje na způsob vazby (binding). 3.1 Příklad definice ve formátu WSDL Předpokládejme, že chceme vytvořit a použít jednoduchou webovou službu. Pro jednoduchost uvažme službu, která nevyžaduje žádné další pomocné komponenty. V [Kosek 02] je uveden příklad služby na sečtení dvou čísel. Popis této služby vyžaduje, abychom stanovili, že požadavek na vykonání této služby bude muset obsahovat 2 parametry této služby označme je jako par0 a par1. Parametry jsou celá čísla: <wsdl:message name='pozadavek_na_secteni'> <wsdl:part name='par0' type='xsd:int'/> <wsdl:part name='par1' type='xsd:int'/> </wsdl:message> 3
Získaný výsledný součet bude opět celé číslo: <wsdl:message name='vysledek_souctu'> <wsdl:part name='vysledek' type='xsd:int'/> </wsdl:message> V části označované porttype je nutno stanovit, jaká operace bude implementovat požadavek na službu Soucet. Služba Soucet bude implementována pomocí operace Sum, které budou předány dva parametry par0 a par1 v tomto pořadí: <wsdl:porttype name='soucet'> <wsdl:operation name='sum' parameterorder='par0 par1'> <wsdl:input name='soucet' message='tns:pozadavek_na_soucet'/> <wsdl:output name='soucet' message='tns:vysledek_souctu'/> </wsdl:porttype> V části označené Binding se stanoví, jakým způsobem bude požadavek transportován. Pro náš účel bude vyhovovat přenos typu RPC Remote Procedure Call, kde vstup a výstup bude zakódován jako XML elementy: <wsdl:binding name='soucetsoap' type='tns:soucet'> <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/> <wsdl:operation name='soucet'> <soap:operation soapaction='' style='rpc'/> <wsdl:input name='soucet'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:soucet'/> </wsdl:input> <wsdl:output name='soucet'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:soucet'/> </wsdl:output> </wsdl:binding> Nakonec v části označené Service stanovíme, který výpočetní uzel bude adresován a jaký vazební element bude použit: <wsdl:service name='soucet'> <wsdl:port name='sum' binding='tns:soucetsoap'> <soap:address location='http://localhost:6060/soucet/'/> </wsdl:port> </wsdl:service> Celý dokument ve formátu WSDL pak bude vypadat následovně: <?xml version='1.0'?> <wsdl:definitions name='sum' targetnamespace='urn:x-kosek:services:sum' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/xmlschema' xmlns:tns='urn:x-kosek:services:sum' xmlns:http='http://schemas.xmlsoap.org/wsdl/http/' xmlns:xsi='http://www.w3.org/2001/xmlschema-instance' xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:soap-enc='http://schemas.xmlsoap.org/soap/encoding/'> <wsdl:message name='vysledek_souctu'> 4
<wsdl:part name='vysledek' type='xsd:int'/> </wsdl:message> <wsdl:message name='pozadavek_na_soucet'> <wsdl:part name='p0' type='xsd:int'/> <wsdl:part name='p1' type='xsd:int'/> </wsdl:message> <wsdl:porttype name='sum'> <wsdl:operation name='sum' parameterorder='p0 p1'> <wsdl:input name='sum' message='tns:pozadavek_na_soucet'/> <wsdl:output name='sum' message='tns:vysledek_souctu'/> </wsdl:porttype> <wsdl:binding name='soucetsoap' type='tns:sum'> <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/> <wsdl:operation name='sum'> <soap:operation soapaction='' style='rpc'/> <wsdl:input name='sum'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:sum'/> </wsdl:input> <wsdl:output name='sum'> <soap:body use='encoded' encodingstyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:sum'/> </wsdl:output> </wsdl:binding> <wsdl:service name='soucet'> <wsdl:port name='soucet' binding='tns:soucetsoap'> <soap:address location='http://localhost:6060/sum/'/> </wsdl:port> </wsdl:service> </wsdl:definitions> 3.2 Webová služba v akci Na straně serveru bude služba implementována následovně: public class Sum { public int Sum(int x, int y) { return x + y; } } Na straně klienta bude služba deklarována: package client.iface; public interface Sum { int Sum(int par0, int par1); } Aplikace, která bude tuto službu využívat by mohla vypadat následovně: package client; import client.iface.*; import org.idoox.wasp.context; import org.idoox.wasp.messageattachment; import org.idoox.webservice.client.webservice; import org.idoox.webservice.client.webservicelookup; public class SoucetKlient{ 5
public static void main(string args[]) throws Exception { String host = "http://localhost:6060/soucet/"; //nastaveni sluzby lookup WebServiceLookup lookup = (WebServiceLookup)Context.getInstance ("org.idoox.webservice.client.webservicelookup"); //zjisteni instance interface Webove sluzby interface přes sluzbu lookup //change the interface class to your Web Service's interface Soucet service = (Soucet)lookup.lookup ("http://localhost:6060/soucet/", Soucet.class,host); } } //nakonec lze vyvolat metodu přes interface webove sluzby System.out.println(service.Soucet(2,5)); 4 Protokol SOAP (Simple Object Access Protocol) Požadavek na službu je třeba zabalit do obálky Poslouží zde protokol SOAP [SOAP 02], což je jednoduchý protokol, který definuje uniformní způsob přenášení dat v XML. Rovněž definuje, jakým způsobem se má pomocí HTTP provést vyvolání vzdálené procedury (RPC - Remote Procedure Call). SOAP vychází z přesvědčení, že ať je aktuální realizace procedury služby jakkoliv sofistikovaná, její vyvolání přes XML zvyšuje operativnost v rámci sítě. Hlavním elementem dokumentu ve formátu SOAP je obálka (SOAP-Envelope). Ta může obsahovat hlavičku (Header) a musí obsahovat tělo (Body). Dále může obsahovat informace pro zpracování výjimek (Fault). Např. požadavek na provedení součtu dvou hodnot může vypadat následovně (do obálky je třeba vložit i odkazy na XML Schemata zabudovaných typů, které používáme): <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/xmlschemas" xmlns:wn0="http://www.w3.org/2001/xmlschemas" xmlns:xsi="http://www.w3.org/2001/xmlschemas-instance"> <nsp:soucet xmlns:nsp="urn:x-kosek:services:soucet"> <par0 xsi:type="wn0:int">2</par0> 6
<par1 xsi:type="wn0:int">5</par1> </nsp:soucet> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Tato zpráva je zaslána na server. Tam musí být obsluha, která požadavek dekóduje a vykoná. Poté je výsledek služby opět zabalen do SOAP obálky a poslán zpět: <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/xmlschemas" xmlns:wn0="http://www.w3.org/2001/xmlschemas" xmlns:xsi="http://www.w3.org/2001/xmlschemas-instance"> <nsp:vysledek_souctu xmlns:nsp="urn:x-kosek:services:soucet"> <vysledek xsi:type="wn0:int">7</vysledek> </nsp:vysledek_souctu> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Tento výsledek je na straně klienta dekódován, je z něj extrahován výsledek a předán metodě println k vytištění. 5 Registr UDDI UDDI (The Universal Description, Discovery and Integration Service) [UDDI 02] poskytuje mechanismus, přes který mohou klienti dynamicky hledat požadované webové služby. Tímto způsobem by aplikace měly být schopny se kontaktovat na služby poskytované externími partnery. Registr UDDI se podobá službě CORBA trader, nebo na něj lze pohlížet jako na DNS service pro aplikace využívající webových služeb. Registr UDDI má dva druhy klientů: ty, kteří chtějí nějakou službu poskytovat a ty, kteří chtějí službu využívat. Registr UDDI obsahuje tzv White pages, které obsahují informaci jako jméno, adresu, číslo telefonu, nebo další kontaktní informace. Sděluje programátorovi, jak se má registrovat při používání služby. Další část UDDI představují tzv. Yellow pages, které obsahují specifikaci, jak může aplikace najít danou webovou službu. Třetí část se nazývá Green pages, kde jsou uvedeny informace nezbytné pro vyvolání služby. Jsou zde uvedena URL služeb, jména, argumenty apod. Registr UDDI se zhruba řečeno skládá z kolekce elementů nazývaných uzly (UDDI nodes), které obsahují data (UDDI data) - posloupnosti elementů několika základních typů: businesskey popisuje firmu dodávající služby, servicekey popisuje skupiny služeb dodávaných firmou, tmodelkey technický model popisuje typ služby (odkaz na WSDL) nebo použitý protokol a bindingkey popisuje informaci nezbytnou pro použití služby. Nad touto posloupností umožňuje sadu operací, které s ní mohou manipulovat a získávat informace, např.: find_binding, find_business, find_relatedbusinesses, find_service, find_tmodel, get_bindingdetail, get_businessdetail, get_servicedetail, get_tmodeldetail nebo get_assertionstatusreport. 7
5.1 Příklad použití registru UDDI Dotaz: Následující dotaz můžeme poslat ke zpracování zabalen do obálky SOAP. Výstupem by měly být informace o firmě (Microsoft). <find_business generic="1.0" xmlns="urn:uddi-org:api"> <name>microsoft</name> </find_business> Výsledek: detailní výpis elementů typu <businessinfo> zaregistrované pro firmu Microsoft, včetně informací o službě UDDI samotné. <businesslist generic="1.0" operator="microsoft Corporation" truncated="false" xmlns="urn:uddi-org:api"> <businessinfos> <businessinfo businesskey="0076b468-eb27-42e5-ac09-9955cff462a3"> <name>microsoft Corporation</name> <description xml:lang="en"> Empowering people through great software - any time, any place and on any device is Microsoft's vision. As the worldwide leader in software for personal and business computing, we strive to produce innovative products and services that meet our customer's </description> <serviceinfos> <serviceinfo businesskey="0076b468-eb27-42e5-ac09-9955cff462a3" servicekey="1ffe1f71-2af3-45fb-b788-09af7ff151a4"> <name>web services for smart searching</name> </serviceinfo> <serviceinfo businesskey="0076b468-eb27-42e5-ac09-9955cff462a3" servicekey="8bf2f51f-8ed4-43fe-b665-38d8205d1333"> <name>electronic Business Integration Services</name> </serviceinfo> <serviceinfo businesskey="0076b468-eb27-42e5-ac09-9955cff462a3" servicekey="611c5867-384e-4ffd-b49c-28f93a7b4f9b"> <name>volume Licensing Select Program</name> </serviceinfo> <serviceinfo businesskey="0076b468-eb27-42e5-ac09-9955cff462a3" servicekey="a8e4999a-21a3-47fa-802e-ee50a88b266f"> <name>uddi Web Sites</name> </serviceinfo> </serviceinfos> </businessinfo> </businessinfos> </businesslist> 6 Závěr Poskytování služeb prostřednictvím sítě bude mít jistě velkou budoucnost. Současné formáty se zabývají zejména syntaktickou stránkou věci. Do budoucna by jistě bylo vhodné rozšířit tyto možnosti o sémantiku např. vyhledání vhodné služby dle požadovaného smyslu (sémantiky). 8
Literatura [BR 00] Bisová, V. - Richta, K.: Transformation of UML Models into XML. In: Proceedings of Challenges 2000 ADBIS-DASFAA. Praha: MATFYZPRESS UK ISBN 80-85863-56-1, str. 33-45. Praha 2000. [Kosek 02] Kosek, J: Inteligentní podpora navigace na WWW s využitím XML. Diplomová práce KIT VŠE Praha, 2002, http://www.kosek.cz/diplomka/. [Nič 02] Nič, M.: SOAP Reference. http://www.zvon.org/xxl/soapreference/ [PR 00] Pokorný, J. - Richta, K.: XML a semistrukturovaná data. In: Proceedings of DATASEM 2000. Brno: Masarykova universita - ISBN 80-210-2428-3, str. 47-63. Brno 2000. [Richta 02] Richta, K.: Using XSL in IS Development. In: New Perspectives on Information Systems Development: Theory, Methods, and Practice. New York : Kluwer Academic / Plenum Publishers, 2002, str. 309-319. ISBN 0-306-47251-1. [Richta 01] Richta, K.: Types in XML and XML-schemas. In: DATESO'01 - Proceedings of Workshop on Databases, Texts, Specifications, and Objects. Desná Černá Říčka, Vydavatelství ČVUT Praha, 2001, str. 20-32. ISBN 80-01-02376-1. [SOAP 02] SOAP Version 1.2 Part 0: Primer, W3C Candidate Recommendation 19 December 2002. http://www.w3.org/tr/soap12-part0/ [UDDI 02] OASIS Committee Specifications, Universal Description, Discovery and Integration, UDDI Version 3.0, Published Specification, 19 July 2002, http://uddi.org/specification.html [Vasudevan 01] Vasudevan, V.: a Web Services Primer. http://webservices.xml.com/pub/a/ws/2001/04/04/webservices/ [WS 02] W3C: Web Services Activity. http://www.w3.org/2002/ws/ [WSDL 03] Web Services Description Language (WSDL) Version 1.2, W3C Working Draft 3 March 2003, http://www.w3.org/tr/wsdl12/ Příloha A: Struktura formátu WSDL <wsdl:definitions name="nmtoken"? targetnamespace="uri"?> <import namespace="uri" location="uri"/>* <wsdl:types>? <wsdl:documentation... />? <xsd:schema... />* </wsdl:types> <wsdl:message name="nmtoken"> * <wsdl:documentation... />? <part name="nmtoken" element="qname"? type="qname"?/> * </wsdl:message> <wsdl:porttype name="nmtoken">* <wsdl:documentation... />? <wsdl:operation name="nmtoken">* <wsdl:input name="nmtoken"? message="qname">? </wsdl:input> <wsdl:output name="nmtoken"? message="qname">? </wsdl:output> <wsdl:fault name="nmtoken" message="qname"> * </wsdl:fault> 9
</wsdl:porttype> <wsdl:binding name="nmtoken" type="qname">* <wsdl:documentation... />? <wsdl:operation name="nmtoken">* <wsdl:input>? <-- extensibility element --> </wsdl:input> <wsdl:output>? </wsdl:output> <wsdl:fault name="nmtoken"> * </wsdl:fault> </wsdl:binding> <wsdl:service name="nmtoken"> * <wsdl:documentation... />? <wsdl:port name="nmtoken" binding="qname"> * <-- extensibility element --> </wsdl:port> <-- extensibility element --> </wsdl:service> </wsdl:definitions> Summary The base of Web services are XML and HTTP. HTTP is a protocol, running practically everywhere on the Internet. XML provides a meta-language in which you can write specialized languages (called XML applications) to express complex interactions between clients and services or between components of a composite service. Behind the front wall of a web server, the XML message gets converted to a middleware request and the results converted back to XML. The resulting infrastructure is similar to CORBA, i.e. IDL plus remote procedure calls. The Web services are based on XML everything is converted into XML (data, function calls, etc.). XML data are transferred with the help of HTTP protocol. Function calls are expressed in an XML application called SOAP (Simple Object Access Protocol). The SOAP document describes, what service, and with which parameters is required. The characteristics of the service should be described somehow. That is duty of WSDL (Web Services Description Language), the other XML application. The complete list of available services is something like directory service, and it is called UDDI (Universal Description, Discovery and Integration Service). 10