WSDL w PHP
by yaras on May.02, 2010, under Soap
Przesyłanie zaawansowanych struktur.
Teraz przychodzi kolej na przesyłanie bardziej zaawansowanych typów niż string czy int. Co jeśli chcemy przesłać cały obiekt czy listę obiektów?
NuSOAP pozwala nam na zdefiniowanie własnych typów. Umożliwia to metoda addComplexType():
$server->wsdl->addComplexType(
'WorkerObject',
'complexType',
'struct',
'all',
'',
array('Id' => array('name'=>'Id', 'type'=>'xsd:int'),
'Name' => array('name'=>'Name','type'=>'xsd:string'),
'Surname' => array('name'=>'Surname','type'=>'xsd:string')
)
);
Dodatkowo zdefiniujmy sobie prototyp funkcji korzystającej z powyższej struktury:
function AddWorker($newWorker)
{
return 12;
}
oraz zarejestrujmy nową funkcję w webserwisie:
$server->register(
'AddWorker',
array('who'=>'tns:WorkerObject'),
array('return'=>'xsd:int'),
$namespace,
false,
'rpc',
'literal',
'Adds new worker to database');
Tutaj warto zwrócić uwagę na linię 3 zwierającą tns:WorkerObject. Oznacza to, iż chcemy korzystać z własnej struktury, a nie typu prostego.
Następnie należy zaktualizować referencję do naszego serwisu. Można to zrobić klikając prawym przyciskiem na referencję i Update Service Reference. Wówczas w naszej klasie WorkerServicePortTypeClient znajdziemy metodę AddWorker(), której argumentem jest … klasa typu WorkerObject – tak, Visual Studio już stworzył odpowiednie klasy i wystarczy z nich korzystać zupełnie jak lokalnie zdefiniowanych klas
, prawda, że wygodne?
Przesyłanie kolekcji.
Ostatnim ważnym elementem jest przesyłanie kolekcji. By przesłać tablicę w NuSOAP należy najpierw zarejestrować obiekt typu array:
$server->wsdl->addComplexType( 'WorkerListObject', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( array( 'ref'=>'SOAP-ENC:arrayType', 'wsdl:arrayType'=>'tns:WorkerObject[]' ) ), 'tns:WorkerObject' );
Prototyp funkcji:
function GetWorkers()
{
return array(
array('Id'=>1, 'Name'=>'Jan', 'Surname'=>'Kowalski'),
array('Id'=>2, 'Name'=>'Anna', 'Surname'=>'Nowak')
);
}
oraz zarejestrować nową funkcję:
$server->register(
'GetWorkers',
array(),
array('return'=>'tns:WorkerListObject'),
$namespace,
false,
'rpc',
'encoded',
'Gets list of Workers');
Po zaktualizowaniu referencji w Visual Studio w klasie WorkerServicePortTypeClient pojawi się dodatkowa metoda GetWorkers() zwracająca tablicę obiektów WorkerObject, voila!
Podsumowanie.
Webserwisy to bardzo wygodny i przyjemny sposób komunikacji sieciowej. Mimo iż nie jest on tak szybki jak własny protokół oparty o TCP, oraz nie umożliwia przesłanie na raz dużych ilości danych, to dla zastosowań ogólnych nadaje się z powodzeniem.
Do PHP istnieje wiele bibliotek umożliwiających w prosty sposób przygotowanie webserwisu. Natknąłem się też na bibliotekę Webservice helper, która (przynajmniej wg zapewnień autora) w jeszcze prostszy sposób udostępnia usługi sieciowe. Mianowicie wystarczy jedynie utworzyć klasę z polami i metodami nas interesującymi oraz wywołać plik service.php przekazując mu jako parametr nazwę naszej klasy:
/service.php?class=contactManager&wsdl
a biblioteka utworzy odpowiedni webserwis. Jeszcze nie próbowałem korzystać z tego systemu, tak więc nie wiem na ile on się sprawdza w praktyce, zapowiada się jednak bardzo interesująco.
Pisząc tego posta korzystałem m.in. z:
Pages: 1 2
:c#, php, Soap, wsdl1 Comment for this entry
1 Trackback or Pingback for this entry
-
dotnetomaniak.pl
May 2nd, 2010 on 9:28 pmWSDL w PHP – yaras.pl…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…
May 3rd, 2010 on 7:24 pm
PHP posiada wbudowaną klasę do stworzenia serwera SOAP – SoapServer. Jeśli jednak chcesz coś więcej, polecam Zend_Soap, który znacznie ułatwia stworzenie serwera SOAP wraz z generowaniem pliku WSDL.
Więcej szczegółów znajdziesz u mnie na blogu – http://wilgucki.blogspot.com/2010/02/zend-framework-i-web-service-zendsoap.html
Podczas testowania serwera SOAP z poziomu aplikacji C# miałem problemy z metodami, które przyjmowały jako argument tablicę (array). Niestety nie udało mi się wywołać takiej metody – próbowałem i hashtable i dictionary.