PA165/WebServices

Z FI WIKI
Verze z 8. 11. 2010, 18:53; Michal Kolínek (diskuse | příspěvky)

(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

Webové služby

Anglický pojem Web Services znamená česky "webové služby", a je daný historicky, ale dnes je vlastně nesprávný, protože nejde jen o služby poskytované přes web. Navíc hrozí záměna se stejným souslovím, jímž firmy vytvářející WWW stránky nebo poskytující prostor k umístění WWW stránek popisují svoji činnost. Nějaký překlad však potřebujeme, používejme tedy pojem webové služby jako terminus technicus.

Hlavní nadějí vkládanou do webových služeb bylo, že se WWW změní ze souboru HTML stránek srozumitelných pouze lidem<a href="#pozn3" name="zpet3" class="pozn">3</a> na soubor XML stránek (statických i dynamických) čitelných programy a tedy, že programy na zcela různých platformách (JavaScript, Java, C, MS .NET, mobilní telefony) budou moci spolu snadno komunikovat.

Technologii webových služeb tvoří tři části:

  • protokol pro vzdálené volání procedur, zvaný SOAP, přenášející data zapsaná jako XML
  • jazyk pro popis poskytovaných služeb, zvaný WSDL
  • mechanismus pro nalezení služeb

1  SOAP

SOAP (Simple Object Access Protocol - česky jednoduchý protokol pro přístup k objektům) lze asi nejlépe vysvětlit na postupu, jak historicky vznikl. Už od počátku WWW (okolo roku 1993) bylo možné zavolat program na webserveru a předat mu textové parametry jednoduše tak, že se na konec URL označujícího program přidal znak ? a za něj se uvedly názvy parametrů a jejich hodnoty oddělené znaky &, například takto:

http://nekde.cz/cgi/p.exe?param1=hodnota1&p2=h2

Tento způsob má jedno omezení, a tím je maximální délka URL, činící v praxi 4kB. Proto byla vymyšlena tzv. metoda POST<a href="#pozn4" name="zpet4" class="pozn">4</a> protokolu HTTP<a href="#pozn5" name="zpet5" class="pozn">5</a>, která parametry předává v těle HTTP požadavku; uveďme si, jak takové volání vypadá:

POST /cgi/p.exe HTTP/1.0

Content-Type: application/x-www-form-urlencoded
Content-Length: 21

param1=hodnota1&p2=h2

Metodou POST je možné předávat jakákoliv data jakékoliv délky, standardizován byl ale jen typ zvaný application/x-www-form-urlencoded, jehož tvar je shodný s tvarem parametrů předávaných přímo v URL.

Postupem času (okolu roku 1997) začaly prohlížeče podporovat i typ multipart/form-data, který umožňuje k textovým parametrům přidat obsah souborů.

S příchodem jazyka XML, který umožňuje zapsat libovolně složitě strukturovaná data do textového souboru platformově nezávislým způsobem, bylo jen otázkou času, než někoho napadlo posílat si metodou POST data v XML. XML má tu výhodu, že se předávaná data nemusí omezovat na text, je možné předávat si složité objekty a kolekce objektů. (XML Schema, XML Namespaces)

1.1  Vývoj standardu

Nejdříve na takovém protokolu začala pracovat firma Microsoft v roce 1998, která ho nazvala SOAP, k ní se poté připojilo mnoho dalších firem včetně IBM. Jiné firmy vyvinuly podobné protokoly s názvy jako XML-RPC, WDDX a XMI. W3C konzorcium vzalo SOAP 1.1 na vědomí<a href="#pozn8" name="zpet8" class="pozn">8</a> v květnu 2000 a vzápětí ustavilo pracovní skupinu zvanou XML Protocol Working Group pro vývoj sjednocujícího protokolu pracovně nazvaného XMLP. Tato skupina vyprodukovala protokol nakonec nazvaný SOAP 1.2, který má od 19. 12. 2002 status kandidáta na doporučení<a href="#pozn9" name="zpet9" class="pozn">9</a>.

V současné době existuje několik desítek různých implementací SOAP na nejrůznějších platformách, od C/C++, přes Javu, .NET, Perl až po JavaScript v prohlížeči Mozilla. Jejich vzájemná kompatibilita je pravidelně testovaná sadou testů SOAPBuilders Interoperability Lab.

1.2  Příklad volání

Uveďme si příklad, jak takové SOAP volání vlastně vypadá. Mějme například funkci boolean jePrvocislo(long cislo), která má číselný parametr jménem cislo a vrací pravdivostní hodnotu podle toho, zda je parametr prvočíslo nebo ne. Vzhledem k tomu, že webová služba může být implementovaná v jakémkoliv programovacím jazyce, typy long a boolean jsou typy definované v XML Schema a ne nutně přítomné v daném programovacím jazyku.

SOAP vyžaduje, aby jméno každé funkce bylo v určitém jmenném prostoru. U objektově orientovaných jazyků tento jmenný prostor odpovídá objektu a funkce jeho metodě, u implementace třeba v jazyku C tento jmenný prostor přímý smysl nemá, ale je nutné nějaký prostor definovat. Jmenný prostor je určen nějakým URI<a href="#pozn10" name="zpet10" class="pozn">10</a>, zvolme třeba urn:mojeURI. Příklad SOAP zprávy volající takovou funkci je na obrázku.

<env:Envelope
  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"

  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xs="http://www.w3.org/1999/XMLSchema"
  xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
 <env:Header/>
 <env:Body>
  <m:jePrvocislo xmlns:m="urn:mojeURI">
    <cislo xsi:type="xs:long">1987</cislo>

  </m:jePrvocislo>
 </env:Body>
</env:Envelope>
Obrázek 1: Příklad SOAP zprávy pro volání funkce
 

Tato zpráva je přenesena na server obvykle metodou POST protokolu HTTP, nebo emailem či jiným způsobem. Postup, jímž je na serveru nalezena funkce, která má být zavolána, záleží na implementaci serveru, obvykle je funkce určena svým jménem a jmenným prostorem. Další možnosti jsou: URL na které přišel HTTP požadavek, obsah speciální HTTP hlavičky SOAPAction, uživatelem definovaný obsah tagu env:Header, nebo něco jiného. SOAP je v tomto benevolentní a nepředepisuje jeden povinný způsob.

<env:Envelope
  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/1999/XMLSchema">
 <env:Body>
  <ns1:jePrvocisloResponse
    xmlns:ns1="urn:mojeURI"

    env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <return xsi:type="xsd:boolean">true</return>
  </ns1:jePrvocisloResponse>
 </env:Body>
</env:Envelope>
Obrázek 2: Příklad SOAP zprávy vracející výsledek

2  WSDL

WSDL (Web Services Description Language, česky jazyk popisu webových služeb) slouší k popisu webové služny, je založený na XML a hojně využívající standardy XML Namespaces a XML Schema. Vznikl sloučením tří jazyků firem IBM, Microsoft a Ariba s názvy NASSL, SCL a SDL do jednoho jazyka nazvaného WSDL 1.1. W3C vzalo WSDL 1.1 na vědomí a ustavilo pracovní skupinu s názvem Web Services Description Working Group, která pak vydala novější verzi WSDL 1.2 a nyní používáme od roku 2004 WSDL ve verzi 2.0.

2.1  Struktura WSDL dokumentů

WSDL jazyk je velice obecný, aby zachoval platformovou nezávislost. Popišme si, jak takový popis webové služby ve WSDL vypadá. WSDL dokument obsahuje popis jedné služby (klíčové slovo service, viz obrázek č.3), což je největší jednotka. Jedna služba má jednu nebo více bran (port). Každá brána má vazbu (binding), což je způsob jak se daná brána volá (například SOAP-přes-HTTP), a nějakou přístupovou adresu (URL). Lze tedy teoreticky mít pro jednu službu více bran s různými vazbami, tj. volat jednu službu různými způsoby, např. první SOAP-přes-HTTP, druhou SOAP-přes-HTTP-nad-SSL a třetí SOAP-přes-SMTP.

<message name="jePrvocisloRequest">
 <part name="cislo" type="xsd:long"/>
</message>
<portType name="Cisla">

 <operation name="jePrvocislo" parametrOrder="cislo">
  <input message="m:jePrvocisloRequest" name="jePrvocisloRequest"/>
  <output message="m:jePrvocisloResponse" name="jePrvocisloResponse"/>

 </operation>
</portType>
<binding name="cislaSoapBinding" type="m:Cisla"> ... </binding>
<service name="CislaService">
 <port binding="m:cislaSoapBinding" name="cisla">

  <wsdlsoap:address location="http://nekde.cz/cisla"/>
 </port>
</service>
Obrázek 3: Část WSDL souboru definující funkci jePrvocislo
 

Každá operace definuje obvykle dvě zprávy (message), jednu vstupní a jednu výstupní, ale může i míň. Každá zpráva obsahuje žádnou, jednu nebo více částí (part), které odpovídají parametrům a návratovým hodnotám.

Typy parametrů a návratových hodnot jsou definovány pomocí XML Schema. Jako jednoduché typy jsou tedy k dispozici řetězce (string), čísla s pohyblivou (float) i pevnou (decimal) řádovou čárkou, pravdivostní hodnoty (boolean), binární data (base64Binary), časový okamžik (dateTime), časový interval (duration), URL (anyURI); dále jejich odvozeniny - výčtové typy, číselné intervaly, záporná čísla (negativeInteger), celá čísla různého rozsahu (int, byte, short, long). Je možné definovat složené typy vzniklé jako souhrny nebo varianty z jiných typů, jednoduchých i složených, dokonce lze definovat jeden typ jako rozšíření druhého, lze tedy vyjádřit dědičnost objektů.

2.2  Nástroje pro práci s WSDL

Dokument v jazyce WSDL příslušný k určité webové službě ji plně popisuje, pokud tedy máme WSDL popis, můžeme webovou službu začít používat. Dokonce existují automatizované nástroje, které z WSDL popisu vygenerují kód pro volání služby v nějakém konkrétním programovacím jazyce, a tento kód pak lze volat stejným způsobem jako by se jednalo o lokálně implementované funkce (takovému zástupnému kódu se říká proxy nebo stub).

WSDL dokumenty není nutné psát ručně, existují nástroje pro jejich generování přímo z kódu programovacího jazyka. Lze tedy s výhodou použít postup, kdy se nejdřív popíše jen rozhraní volatelných funkcí (vytvoří se jen interface v jazyce Java nebo deklarace funkcí v .h souboru v jazyce C), automatizovaným nástrojem se vygeneruje WSDL popis zatím neexistující webové služby, dalším automatizovaným nástrojem se z WSDL dokumentu vygeneruje kód pro volání i implementační serverovou část, a stačí pak dopsat vlastní funkcionalitu do vygenerovaného kódu.

3  UDDI a WSIL

Zatímco SOAP a WSDL jsou zavedené a v praxi používané standardy, v oblasti nalézání webových služeb je situace jiná. Existují dvě hlavní varianty protokolu pro vyhledávání WS.

Historicky starší UDDI (Universal Description, Discovery and Integration, česky univerzální popis, objevování a spojování) nabízí veřejnou databázi (anglicky registry), do které poskytovatelé webových služeb mohou ukládat popisy služeb a uživatelé ji prohledávat. Dvě takové centrální databáze spravovaly firmy IBM a Microsoft. Praxe ale ukázala, že plné dvě třetiny záznamů v těchto databázích jsou neplatné a proto byly obě databáze kolem roku 2006 zrušeny. Druhý a hlavní problém je ten, že databáze nijak nezaručuje důvěryhodnost poskytovatelů služeb.

Opačným mechanizmem řeší nalézání webových služeb jazyk WSIL (Web Services Inspection Language, česky jazyk přehlídky webových služeb), mimochodem také vyvinutý firmami IBM a Microsoft. WSIL popisuje služby poskytované nějakým poskytovatelem pomocí souboru jménem inspection.wsil umístěného vždy v hlavním adresáři webserveru poskytovatele. Tento popis je tedy na všeobecně známém místě, a prohledávací služby jako Google a Yahoo mohou nabízet vyhledávání v těchto souborech.


6  Odkazy

7  Poznámky

     <img class="pevnasirka" src="../img/bily.png" width="1" height="1" alt="setting"/>
<a name="pozn1" class="pozn">1</a> RPC - Remote Procedure Call, CORBA - Common Object Request

Broker Architecture, RMI - Remote Method Invocation


<a href="#zpet1">... zpět do textu</a>
<a name="pozn2" class="pozn">2</a> W3C - World Wide Web Consortium - organizace definující standardy Internetu
<a href="#zpet2">... zpět do textu</a>
<a name="pozn3" class="pozn">3</a> Obsahu HTML stránky rozumí pouze živý člověk.

Program vidí jen soubor typograficky upravených textů, najde např. co je napsáno kurzívou, ale nerozumí smyslu, nemůže např. najít ve stránce cenu popisovaného výrobku.


<a href="#zpet3">... zpět do textu</a>
<a name="pozn4" class="pozn">4</a> od anglického post - "poslat",

předchozí metoda volání URL se jmenuje GET - anglicky "získat".


<a href="#zpet4">... zpět do textu</a>
<a name="pozn5" class="pozn">5</a> Hyper Text Transfer Protocol - protokol pro přenos

souborů, název je zavádějící, lze přenášet cokoliv, ne jen hypertext


<a href="#zpet5">... zpět do textu</a>
<a name="pozn6" class="pozn">6</a> XML Schema - jazyk pro definice

struktury a typovosti dat, viz článek XML snadno a rychle


<a href="#zpet6">... zpět do textu</a>
<a name="pozn7" class="pozn">7</a> Namespaces - mechanismus pro rozlišení různých množin tagů v jednom dokumentu
<a href="#zpet7">... zpět do textu</a>
<a name="pozn8" class="pozn">8</a> SOAP 1.1 má status W3C Note (poznámka), což znamená pouhé zveřejnění a žádnou podporu ze strany W3C
<a href="#zpet8">... zpět do textu</a>
<a name="pozn9" class="pozn">9</a> Vývoj standardu W3C probíhá ve čtyřech fázích:

první je W3C Working Draft (pracovní návrh), následuje W3C Candidate Recommendation (kandidát na doporučení) - návrh určený k veřejné diskuzi, třetí fáze je W3C Proposed Recommendation (navržené doporučení), a hotový standard se nazývá W3C Recommendation (doporučení).


<a href="#zpet9">... zpět do textu</a>
<a name="pozn10" class="pozn">10</a> Uniform Resource Identifier, URI

jsou sjednocením URL a URN - Uniform Resource Names


<a href="#zpet10">... zpět do textu</a>
<a name="pozn11" class="pozn">11</a> Java servlet container - v prostředí Javy obdoba webserveru
 spouštějícího programy, místo spouštění procesů ale volá metody Java
 objektů. Příkladem jsou Apache Tomcat nebo Jetty.

<a href="#zpet11">... zpět do textu</a>


Článek převzat od Martina Kuby, původní znění zde: <a href="http://www.ics.muni.cz/zpravodaj/articles/269.html">http://www.ics.muni.cz/zpravodaj/articles/269.html</a>

   </body>

</html>