Webszolgáltatás: WSDL és SOAP alapok I. rész
A webszolgáltatás vagy angolul webservice, alkalmazások közötti adatcserére szolgáló protokollok és szabványok gyűjteménye. E cikksorozaton belül csak a WSDL és SOAP témakörével fogunk foglalkozni, de nyilván a protokoll gyűjtemény nem csak ezeket a protokollokat tartalmazza. A cikksorozat egyszerű példákon keresztül mutatja be és próbálja elmagyarázni, hogy mit jelentenek az egyes fogalmak, hogy és milyen eszközökkel lehet PHP alatt SOAP-ra épülő kommunikációt elkészíteni.
A WSDL dokumentum és annak felépítése
A WSDL (Web Services Description Language), a webszolgáltatások leírására szolgáló dokumentum. A WSDL a webszolgáltatás nyilvános felületét írja le. Ez egy XML-alapú szolgáltatás-leírás a webszolgáltatással történő kommunikációról. A leírásban szerepelnek a protokollkötések, az adatok típusai és az üzenetek, amelyek az adott webszolgáltatások használatához szükségesek. Továbbá az üzenet továbbításához használt protokollok és a szolgáltatás elérhetősége. A leggyakrabban használt protokoll az üzenetek továbbítására a HTTP.
Első hallásra bonyolultnak tűnhet a megfogalmazás, ezért nézzünk egyből egy “Hello World” példát. A teljes WSDL dokumentum megtekinthető: WSDL példa dokumentum. Látható hogy a fejléc része adott, a kötelező elemeken kívül csak a dokumentum nevét tartalmazza.
WSDL: típusok leírása
12 13 14 15 16 17 18 | <!-- Típusok definíciója --> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Hello"> <xsd:element name="getName" type="xsd:string" /> <xsd:element name="HelloResponse" type="xsd:string" /> </xsd:schema> </types> |
A WSDL dokumentumon belül, a <types> elem foglalja magában az üzenetküldés során küldött és fogadott adatok típusainak definícióját. Mostani példánkban megelégszünk egy egyszerű string típussal. Ezen kívül további egyszerű típusokat is tudunk használni, pl: boolean, float, integer. (További típusok: XML Schema Datatypes) Egy későbbi részben szólni fogunk az összetettebb tömb és objektum típusokról is. A típusok között két adat típusát definiáljuk. Az egyiket getName-nek, másikat HelloResponse-nak hívják. Ezek az adatok egy-egy üzenet részeit alkotják.
WSDL: üzenetek definíciója
20 21 22 23 24 25 26 27 28 | <!-- Üzenetek definíciója --> <message name="doHello"> <!-- doHello üzenet --> <part name="yourName" type="tns:getName" /> </message> <message name="doHelloResponse"> <!-- válaszüzenet a doHello üzenetre --> <part name="return" type="tns:HelloResponse" /> </message> |
A <message> elemek foglalják magukban az üzenetek leírásait. Két üzenetet definiáltunk, egyiket doHello-nak, másikat doHelloResponse-nak hívják. Mindkettő csak egy-egy üzenetrészből állnak (yourName és return), melyek egy-egy adatot tartalmaznak, getName és HelloResponse típusút. A következő ábra mutatja az összefüggéseket az egyes elemek között:

WSDL: Portok és műveletek
30 31 32 33 34 35 36 37 | <!-- Támogatott műveletek --> <portType name="HelloPort"> <!-- doHello művelet --> <operation name="doHello"> <input message="tns:doHello" /> <output message="tns:doHelloResponse" /> </operation> </portType> |
A WSDL dokumentumon belül, a <portType> elemfoglalja magában a szolgáltatás által nyújtott műveleteket, és a műveletek végrehajtásához szükséges üzeneteket. Fenti példánkban egy portot definiáltunk (HelloPort) a szolgáltatáshoz, amelyben egy műveletet írtunk le (doHello). A művelet során két üzenetet használunk fel. Egyik, a szerver oldaláról nézve, bejövő, a másik kimenő üzenet. Ebből látható, hogy a művelet úgy néz ki, hogy a kliens elküld egy doHello üzenetet, amelyre a szerver doHelloResponse nevű üzenettel reagál. Természetesen több portot és azon belül több műveletet is le tudunk írni egy WSDL dokumentumon belül. Az alábbi ábrán láthatjuk az összefüggéseket, a műveletek és az üzenetek között:

Az egyes műveleteket, amelyeket a WSDL dokumentumban definiáltunk, meg fogjuk feleltetni PHP függvényeknek. Jelen esetben lesz majd egy doHello nevű függvényünk, aminek egyetlen bemenő paramétere egy string, és szintén string-el fog visszatérni. Erről részletesebben a következő részben, ahol látni fogjuk, hogy WSDL dokumentum birtokában a szolgáltatás használatához, alig pár sor PHP kódra van szükségünk.
WSDL: kötések
39 40 41 42 43 44 45 46 47 48 49 50 51 | <!-- Protokoll kötések --> <binding name="HelloBinding" type="tns:HelloPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="doHello"> <soap:operation soapAction="urn:HelloAction" /> <input> <soap:body use="encoded" namespace="urn:Hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:Hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> |
A<binding> címke alatti definíciók határozzák meg a protokoll és az adatátvitel tulajdonságát. Mostani példákban csak a SOAP protokollal foglalkozunk. Természetesen a WSDL arról tájékoztat, hogy milyen szolgáltatásokat milyen módon érhetünk el, ezért nem csak SOAP protokoll használható, illetve átviteli csatornaként nem csak a HTTP. Az üzeneteket továbbíthatjuk bármilyen más módon is, a WSDL dokumentum erre is ad lehetőséget. A legelterjedtebb módszer azonban a HTTP-n keresztüli adatátvitel. Megjegyzem, hogy egy WSDL dokumentumon belül az egyes műveletekhez rendelt protokoll akár különböző is lehet, de egy kötéshez csak egy protokollt tartalmazhat. A fenti példában, adatátviteli csatornának SOAP-ot választottunk HTTP-vel: transport=”http://schemas.xmlsoap.org/soap/http”. A kiválasztott protokollhoz a doHello nevű műveletet rendeljük, és megadjuk, hogy a ki és bemenő paraméterei hogyan legyenek kódolva. A műveletek és a kötések közötti összefüggéseket a következő ábra szemlélteti:

WSDL: szolgáltatás elérhetősége
53 54 55 56 57 58 | <!-- Szolgáltatás elérhetősége --> <service name="HelloService"> <port name="HelloPort" binding="tns:HelloBinding"> <soap:address location="http://localhost/hello_server.php" /> </port> </service> |
A WSDL dokumentumon belül a <service> címke alatt definiáljuk a szolgáltatás elérhetőségét. Jelen esetben egy kaput definiáltunk HelloPort néven, amely a SOAP szerver címére mutat.
Ha SOAP-al akarunk webszolgáltatásokat használni, egyelőre nem lesz szükségünk a WSDL dokumentumról több információra. Következő részben kipróbáljuk a példánkat, és meglátjuk, hogy a WSDL dokumentum létrehozása után, nagyon egyszerűen tudunk távoli szolgáltatásokat létrehozni, használni a SOAP segítségével.


7 hozzászólás, szólj hozzá Te is!
alippai
Ez teccik
Alif várom a 2. részt hogy kipróbálahassam.
2008. 04. 22.
szaky
Mondjuk ez akkor lesz érdekes, ha valami módon automatikusan generálódik a wsdl…
2008. 04. 29.
Polonkai Gábor
Lehet WSDL-t generálni, akár egy létező PHP osztályból is.Erre is fogok majd példát mutatni. addig is itt a 2 rész: http://www.php-blog.hu/webszolgaltatas-wsdl-es-soap-alapok-ii-resz-pelda.html
2008. 04. 29.
Najdorf
Helló!
Én egy olyan feladatot kaptam, hogy írjak egy cliens-t, ami kommunikál egy webservice-el. Kaptam angol e-book-at, találtam a neten sok magyar leírást és a prog.hu-n is sok jó hozzászólás volt, de eddig a te oldalad a legjobb:)
Sokat segített nekem!
Köszi
2008. 12. 05.
Nemes Mihály
Rettentő jól eltalált leírás! Folytatás a II. rész után nem lesz? Fentebb van egy ilyen (elhamarkodott
ígéret például:
“Egy későbbi részben szólni fogunk az összetettebb tömb és objektum típusokról is.”
És nyilván sok egyéb hasznosat is tudnál mesélni.
És egy buta kérdés: Mivel csináltad az ábrákat, pl. ahol karikák és vonalak kötik egymáshoz az összetartozó részeket?
2009. 05. 21.
Polonkai Gábor
Lesz folytatás, mindenképp! Az ábrákat pedig paintben készítettem
Hirtelen nem találtam jobb megoldást. Mondjuk ha weboldalakkal akarod ugyanezt, akkor javaslom a https://addons.mozilla.org/en-US/firefox/addon/5648 FireShot plugint Firefox alá. Nekem nagyon bevált.
2009. 06. 01.
Nemes Mihály
Ami nagyon nehezen található meg (és pont most küzdök vele): SOAP header oda-vissza küldözgetése.
Erről hasznos lenne egy pár okosság.
2009. 06. 26.
Hozzászólás írása: “Webszolgáltatás: WSDL és SOAP alapok I. rész”