PHP SOAP kiterjesztés - SOAP Header használata
September 3rd, 2008
Minden SOAP üzenet tartalmaz egy kiegészítő SOAP fejlécet (Header elem).
Az opcionális fejléc elem, a Header kiegészítő adatok megadására szolgál.
Ugyanabból a célból létezik, mint a HTTP Header. Leggyakrabban a Header elembe
a munkamenet (session) azonosítót, vagy a kliens hitelesítéséhez szükséges adatokat teszik.
Kliens
Lássuk, hogyan kell a PHP5-ben megjelent SOAP kiterjesztéssel beállítani egy SOAP fejlécet.
Tegyük fel, hogy a munkamenet azonosítot kell elküldenünk minden egyes SOAP üzenetben.
A Header elem bármilyen elemeket tartalmazhat, csakis tőlünk függ a tartalma
(na meg persze a kiszolgáló oldalon a WSDL fájlban deklaráltaktól).
A példa kedvéért a munkamenet azonosítót egy sessionId nevű elemben kell elhelyeznünk,
ami egy további ApiUserAuthHeader szülő elemben kell, hogy legyen. Ezek az elemek pedig a
urn:ExampleAPI névtérben kellenek, hogy legyenek.
Lássunk egy kész SOAP üzenetet, amit a kliens küld a kiszolgálónak.
Íme a PHP kód:
A SoapHeader osztály
szolgál SOAP fejléc létrehozására. Létre kellett hoznunk egy ApiUserAuthHeader osztályt, aminek egy
sessionId tulajdonságot adunk.
Annak ellenére, hogy a SoapHeader konstruktorában, az első paraméterrel beállítottuk az urn:ExampleAPI, a SOAP
kiterjesztés valamilyen okból mégsem ad a sessionId elemnek prefixet,
ezért volt szükség az ApiUserAuthHeader osztály konstruktorában a sessionId-t SoapVar objektummal létrehozni
(egyébként elég lett volna egy sima publikus sessionId nevű változó is).
Erről itt olvashatunk többet: http://bugs.php.net/bug.php?id=40318&edit=1.
A login metódusnak a paramétereket így is átadhattuk volna, ez is helyes megoldás:
Ha viszont így hívtuk volna meg a login metódust, akkor a SOAP kiterjesztés helytelenül kódolta volna a paramétereket a SOAP törzsben.
$ret = $client->__call('login',array('WorkaholicGroupApiKey','0c9ed93ec403851a2f7682aceb98a5a9'));
Kiszolgáló
Kiszolgáló oldalon a következőkre van szükségünk:
Elkapni a beérkezett SOAP XML üzenetet
$request = file_get_contents('php://input');
Kiparszolni belőle a sessionId elem tartalmát

Leave a Reply