php blog magyarul

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 üzenetek és típusok összefüggései

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:

WSDL műveletek és üzenetek összefüggései

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 műveletek és kötések összefüggései

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!

  1. alippai

    Ez teccik :P
    Alif várom a 2. részt hogy kipróbálahassam.

  2. szaky

    Mondjuk ez akkor lesz érdekes, ha valami módon automatikusan generálódik a wsdl…

  3. 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

  4. 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

  5. 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?

  6. 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.

  7. 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.

Hozzászólás írása: “Webszolgáltatás: WSDL és SOAP alapok I. rész”