php blog magyarul

Webszolgáltatás: WSDL és SOAP alapok II. rész (példa)

Előző részben nagyon egyszerű példán keresztül mutattuk meg, hogy miként épül fel egy WSDL dokumentum. Megígértem, hogy a cikket folytatni fogom, és be fogom mutatni hogy a WSDL dokumentumot és a SOAP protokollt felhasználva milyen egyszerűen tudunk webszolgáltatást használni. Lássuk tehát a példát…

SOAP Szerver oldali PHP szkript

<?php
ini_set("soap.wsdl_cache_enabled","0");        
 
$server = new SoapServer("hello.wsdl");
class HelloService{
  function doHello($yourName){
    if (strlen(trim($yourName))) {
      return "Szia, ".$yourName;
    } else {
      throw new SoapFault("Server","Nem adtad meg a nevedet!");
    }
  }
}        
 
$server->setClass("HelloService");
$server->handle();
?>

A példa a PHP5 beépített SOAP könyvtárát használja. PHP 4 alatt a nuSOAP-al próbálkozhatunk, erre azonban példát most nem hozunk. A használata nagyon hasonló, szinte csak szintaktikai különbségek vannak.

Nézzük a kód magyarázatát. Mivel fejlesztésről van szó a WSDL állományok gyorsítótárazását kikapcsoljuk a 2. sorban. Ezután létrehozunk egy SOAP szervert, gyakorlatilag példányosítjuk a megfelelő osztályt, amelynek konstruktorában átadjuk a WSDL állományunk elérési útvonalát és nevét.

Készítünk egy osztályt, ami a WSDL dokumentumban meghatározott függvényeket valósítja meg. A neve szabadon választható, jelen esetben HelloService, de a függvények nevei nem. A doHello nevű függvénynek, és annak bemenő és kimenő paramétereinek egyeznie kell a WSDL dokumentumban leírtakkal. Ebben azt írtuk, hogy egy bemenő és egy kimenő paramétere van a doHello függvénynek. A függvény mindössze annyit tesz, hogy a bemenő paraméterként kapott nevet felhasználva, üdvözlő szöveget küld vissza.

A definiált osztályt a SOAP szervernek átadjuk értelmezésre, és meghívjuk a SOAP szerver handle() függvényét. Ezzel meg is írtuk a Hello.wsdl-ben foglalt webszolgáltatás szerver oldalát. Amennyiben a webszolgáltatás szerver oldalát máshol futtatnánk, ne felejtsuk el átírni a szolgáltatást leíró WSDL dokumentum 56. sorában a szolgáltatás elérhetőségének URL-ét.

SOAP kliens oldali PHP szkript

<?php
ini_set("soap.wsdl_cache_enabled","0");      
 
try{
  $sClient = new SoapClient('http://www.php-blog.hu/peldak/soap/hello.wsdl');
  $response = $sClient->doHello('Polonkai Gabor');
  echo $response;
} catch(SoapFault $e){
  var_dump($e);
}
?>

Mint a példából is látszik a kliens oldali PHP szkript is végtelenül egyszerű. Try-catch blokkban megpróbáljuk példányosítani a SoapClient osztályt, aminek konstruktorában átadjuk a szolgáltatást leíró WSDL dokumentum URL-ét. Ezután az osztály lekezeli a SOAP üzenetek és válaszok generálását, valamint biztosítja a felületet a webszolgáltatás leírásában definiált függvények használatához. A példányosítás után meghívjuk a webszolgáltatás egyetlen definiált függvényét, amelynek átadjuk az egyetlen bemenő paramétert. Visszatérési értékét a kimenetre írjuk. Hiba esetén a hibát tartalmazó objektumot a kimeneten részletezzük. Természetesen a WSDL dokumentum illetve a SOAP szervert futtató PHP szkript bármelyik másik szerveren elhelyezhető.

SOAP példa PHP alatt: letöltés

A példa állományok letölthetőek: SOAP PHP-vel példa. Ugyanakkor a kisérletezést megkönnyítendő, a példában bemutatott webszolgáltatást elérhetővé tettük, amelynek WSDL dokumentuma a következő URL-en érhető el: http://www.php-blog.hu/peldak/soap/hello.wsdl

21 hozzászólás, szólj hozzá Te is!

  1. vik

    Köszöntem szépen Mester! :)

    Végre egy Soap-szerver kód, ami úgy tünik mindenhol működik. Már találtam neten pár ilyet, de egyik sem akart még mindenhol gond nélkül futni. Ez az első ami nekem problémamentes, és egyben az első ami magyar nyelvű oldalon találtam.

    Mondjuk aki kockának áll, az egyben vállalja is hogy a szakma nyelve angol, de azért üdítő egy magyar nyelvű szinvonalas blogra akadni. Remélem hosszúéletű lesz a blog, én rövid idő alatt megkedveltem.

  2. vik

    Ja, és két apróság. (bár ez OFF)
    A rendszeróra nem az igazi, vagy az időzóna nem, vagy valami…
    Illetve jó lenne egy favicon, a bookmarkok és az rss olvasók miatt is.

  3. vik: köszönöm a biztató szavakat :) Igen, az angol elengedhetetlen, de ugye mennyivel egyszerűbb magyar nyelven kommunikálni és javaslattot tenni? Személy szerint úgy vagyok vele, hogy egy magyar blogon sokkal könnyebben kommentelek és mondom el a véleményem. Faviconon már 1 hete gondolkodom, még nem találtam igazán jó ihletet, de ígérem lesz ilyen. A rendszeróra érdekes lehet, kíváncsi vagyok, hogy ha most postolok milyen timestamp-el kerül az adatbázisba, megjelenítésbe stb. Ki fogom deríteni.

  4. kuczfer

    Nagyon jó, hogy publikálva lett a SOAP téma. Sokaknak jó fog jönni. Talán még a fontosabb PEAR csomagok bemutatása se lenne hülyeség. Sok embernek nagy segítség lehet.

  5. MIKI

    Szuper ez a cikk, én személy szerint most értettem meg a web szolgáltatások működését….nagyon köszönöm Gábornak ezt a remek ismertetőt pontosan azt írta le amit keresgéltem már pár hónapja, de sehol nem találtam…..

  6. Black

    Helló!
    Nagyon jó a cikk! Gratula érte! Eddig nem tudtam mi az a SOAP (még nem kellett használnom), most kezdtem el utána nézni, és örülök hogy megtaláltam ezt az oldalt! Igy már sejtem hogy mire is lehet használni :)

  7. Najdorf

    Én is csak hasonló dolgokat tudok mondani, mint a többiek.
    Mondjuk én nem vagyok php guru:), de simán megértettem.
    Nagyon érthetően írtad le.
    Már várom, hogy többet megtudjak a Webservicekről:).

    Köszönöm én is a tanultakat!!!
    Csak így tovább!

  8. Najdorf, köszönöm a biztató hozzászólásodat! Hamarosan megírom a harmadik részét, iratkozz fel az RSS-re és értesülni fogsz róla!

  9. Najdorf

    Kérdés: még él a bemutatott webszolgáltatás?
    valamint ha kiszeretném próbálni, akkor a zip-ben szereplő clienst és servert is létre kell hoznom?
    Vagy csak a clienst, amivel csatlakozhatok a webszolgáltatáshoz és a servert már megírtátok?
    Java-ban írnám meg a clienst és ha kell, akkor a servert is.

    Előre is köszi!

  10. Még él a szolgáltatás, nyugodtan megírhatod Java-ban a klienst. A WSDL fájl url-jét megtalálod a zipben található kliens php-ban, ha az megy, akkor szervert is meg kell írnod.

  11. Najdorf

    Re:)!
    Sikerült eredményeket elérnem a java “világában” is a webservicek terén!!!
    Sokat segített Polonkai Gábor blogja, ezért gondoltam megosztom veletek, hátha Gábor hozzá tudja fűzni a blogjához.
    Kis tutorialok:
    - Apache tomcat alatt: http://www.p2pgridbook.com/coresite/WebServices/deploy.html
    - Jboss server alatt: http://www.javabeat.net/articles/40-creating-webservice-using-jboss-and-eclipse-europa-1.html

    Remélem segíthettem:P

  12. Najdorf

    Ajánlom figyelmetekbe a jws-t és az axis-t.
    A jws-nél annotációk segítségével (hasonló a java commentekhez pl.: @…) lehet elérni a webservice-t és generálni is lehet java kód segítségével wsdl-et nagyon egyszerűen.
    Az axis-nál szükség van egy wsdd-re, amiből java osztályokat generál az axis. A wsdd nagyon hasonlít a wsdl-re és van konvertálási lehetőség is. Ebben nem mélyültem el, én inkább kézzel írnám meg a wsdl-ből a wsdd-t. Kicsit más a szintaktikája.

  13. Szia Najdorf!

    Köszönöm a linkeket! Java-val nem foglalkozok erősen, de a tapasztalat mindig jól jön! :) A másik, hogy PHP alatt is létezik olyan online tool, ami WSDL-ből generálja a PHP osztályt.
    http://1018-media.com/wsdlstubgen/
    Illetve php osztályból WSDL
    Ez is egy érdekes framework:
    http://wso2.org/projects/wsf/php
    Illetve PHP osztályból WSDL generálás:
    http://www.phpclasses.org/browse/package/3509.html

    Megmondom őszintén ezeket nem próbáltam még ki személyesen, de hamarosan ki fogok próbálni néhány hasonlót is.

  14. Joe

    Szia Gábor!

    Nagyon jó a cikk, gratulálok hozzá. Van viszont egy problémám. Az én esetemben nem LAMP van, hanem Apache/2.0.59 (NETWARE) PHP/5.0.5 mod_jk/1.2.21. Hozzáteszem, nem vagyok php-s, de most így kéne megoldanom egy ws-es feladatot.

    Első körben a kliens kódot próbáltam futtatni, de nem tudta példányosítani a SoapClient classt, mert nem találta… Mi a teendő ilyenkor?

    Köszi előre is,
    J

  15. Najdorf

    Azért jöhetett volna már válasz:S

  16. Isotec

    Szia Gábor!

    Nagyon remek és hasznos volt számomra ez a két rész és kérdezném, hogy lesz-e folytatása?

    Köszi

    Csak így tovább!!! :)

  17. Najdorf

    Idézet:

    “Polonkai Gábor

    Najdorf, köszönöm a biztató hozzászólásodat! Hamarosan megírom a harmadik részét, iratkozz fel az RSS-re és értesülni fogsz róla!

    2008. 12. 07.”

  18. X4K

    Hali! Én is csak gratulálni tudok a cikkhez, mert nagyon hasznos és érthető. Kérdezném, hogy nem tervezed-e az NuSOAP-os változat elkészítését? Szerintem sokunknak segítenél vele, mert sajnos még mindig vannak olyan fizetős tárhelyszolgáltatók, akik csak PHP4-et telepítenek.

  19. Most, hogy a demo programból a távoli szerveremről “üdvözöltél”, rendkívül elégedett vagyok:) Szuper a cikk, és hogy egy működő példaprogramom van, ez csak hab a tortán!

    Nagyon szépen köszönöm a segítséget, amelyet nyújtottál nekünk!

  20. Paleko: örülök hogy segíthettem!
    X4K: jelenleg nem tervezem, mert elég sok teendő összejött az utóbbi időben. Azonban ha lesz egy kis időm, meg fogom csinálni.

  21. rahzel

    Bárcsak suliba is így magyaráznák :D

Hozzászólás írása: “Webszolgáltatás: WSDL és SOAP alapok II. rész (példa)”