yaras.pl

WSDL w PHP

by 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

:, , ,

1 Comment for this entry

  • batman

    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.

1 Trackback or Pingback for this entry

Leave a Reply

You must be logged in to post a comment.

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...

Archives

All entries, chronologically...