Porady dotyczące programowania aplikacji internetowych

Przykłady programowania w PHP

Jak napisać w PHP własny Web Service korzystając z rozszerzenia WSF / WSO2.

Wstęp

WSF jest bazowym produktem open source pozwalającym na stworzenie własnego Web Service na podstawie którego opracowano szereg rozszerzeń. Cały pakiet jest dostępny do ściągnięcia na stronie wso2.org.

Instalacja rozszerzenia WSF / WSO2

Moje uwagi dotyczące instalacji na serwerze typu Linux dystrybucja Debian:

  1. Przed kompilacją upewnić się, że niezbędne pakiety są zainstalowane wywołując odpowiednie polecenia z shell, w moim porzypadku były to:
    • apt-get install php5
    • apt-get install php5-dev
    • apt-get install pkg-config
    • apt-get install libapache2-mod-php5
    • apt-get install libxml2
    • apt-get install libxml2-dev
  2. Ściągnąć i rozpakować do katalogu /tmp wersję tar.gz pliku a następnie mając uprawnienia pozwalające na kompilację pakietów wywołać kolejno polecenia z poziomu shell:
    • ./configure
    • make
    • make install
  3. Jeżeli podczas wywołania jednej z powyższych operacji zwracany jest błąd przeanalizować wyświetlony komunikat i wrócić do punktu pierwszego doinstalowywując w razie potrzeby odpowiednie pakiety.
  4. Dopisać zgodnie ze wskazówkami umieszczonymi w pliku README.INSTALL odpowiednie komendy w pliku konfiguracyjnym /etc/php.ini tak aby rozszerzenie było poprawnie odnajdywane przez parser.

Uwagi do instalacji na serwerze w środowisku Windows typu WAMP:

  1. Sprawdzić, czy zainstalowane są wszystkie niezbędne biblioteki:
    • axis2c.dll
    • wsf.dll
  2. Zintegrować całość w środowisku WAMP lub XAMPP.

Wywołując skrypt

można zweryfikować poprawność instalacji (powinna się pojawić informacja o pakiecie WSF) oraz domyślne parametry rozszerzenia.

Teraz możemy przejść przejść do zasadniczej części napisania własnej "Usługi" (Web Service).

Założenia

Mój przykład będzie polegał na utworzeniu kodu przypisującego do zmiennej $in_id przekazaną wartość, oraz do zmiennej $ob_nodes tablicę z jednym elementem zawierającym pusty obiekt wyjściowego typu (zwróć uwagę na rekurencyjną możliwość zagnieżdżania bardziej skomplikowanych struktur). W normalnym środowisku Web Service powinien pobierać i odpowiednio przetwarzać rekordy z bazy danych a następnie wysyłać je jako obiekty. Aplikacja odpowiedzialna jest natomiast za wizualizację wyników w przeglądarce.

Kod Usługi - Web Service

  1. Definicja nagłówka
  2. Definicja interfejsu klasy

    Zanim przystąpię do pisania właściwego kodu proponuję stworzenie bazowego interfejsu klasy w którym zadeklaruję funkcję wymaganą do prawidłowego działania Usługi.Po co w ogóle korzystać z interfejsów a tym bardziej z komentarzy, które zwykle w tym przypadku zajmują więcej miejsca niż sam kod?

    Korzystając umiejętnie z interfejsów wymuszamy na klasach, które je implementują zgodność szablonową ze strukturą projektu. Umieszczenie komentarzy bezpośrednio w kodzie pozwala na automatyczne generowanie w tym przypadku kodu WSDL oraz dokumentacji API dla potencjalnych developerów. Polecam PHPdocumentor, jako narzędzie pozwalające na tworzenie dokumentacji na podstawie plików źródłowych projektu.
  3. Definicja obiektu wyjściowegoWymogiem WSF podczas tworzenia własnego kodu Web Service jest umiejętny sposób pisania komentarzy, na podstawie których rozszerzenie tworzy dynamicznie plik WSDL (Web Services Description Language).
  4. Definicja oraz oprogramowanie klasy wykonującej zadaną operację
  5. Inicjalizacja Web ServiceCały utworzony plik proponuję zapisać na serwerze pod nazwą example.ws.php i uruchomić z poziomu przeglądarki. Jeśli wszystko przebiegnie zgodnie z planem uruchomienie pliku wyświetli komunikat o dostępnych funkcjach. Uruchomienie pliku z parametrem, czyli example.ws.php?wsdl wyświetli z kolei wygenerowany kod WSDL.

Client

Teraz przejdę do części w której podam przykład strony klienta (framework), która będzie w stanie wykorzystać wcześniej przygotowany Web Service.

Kod Client

  1. Na początek nagłówek
  2. Definiowanie klas zapytania i odpowiedzi wraz z mapą:
  3. Wywołanie Web Service I to wszystko wystarczy teraz powyższy plik zapisać na serwerze pod nazwą client.php. Wywołując go z poziomu przeglądarki wyświetlony zostanie obiekt z rezultatem operacji. Należy pamiętać jedynie o podmianie ścieżki do wcześniej utworzonego pliku http://localhost/myproject/example.ws.php?wsdl.

Podsumowanie

Tworząc umiejętnie Web Service można przygotować optymalny kod pod względem funkcjonalności oraz łatwości w modyfikacji, gdzie warstwa wizualna będzie odseparowana od warstwy logicznej projektu i komunikacji z bazą danych.

W przypadku połączeń z bazą danych polecam stosowanie zaawansowanych pakietów ORM jak na przykład Doctrine lub statycznych obiektów typu singletone, które będą dostępne jako zmienna globalna niezależnie od miejsca wywołania.

W związku z tym, że plik WSDL może być zapamietany (cache) w domyślnym katalogu, na przykład /tmp trzeba zrestartować Web Server po modyfikacjach metod i klas WS, albo umiejętnie zarządzać zmienną: wsdl_cache_enabled z poziomu php Czasami trzeba skasowaś z katalogu /tmp tymczasowe pliki wsdl-* (gdzie * oznacza niepowtarzalny alfanumeryczny ciąg znaków).

Od niedawna całość kompiluje się poprawnie również z PHP 5.3. Jak do tej pory nie udało mi się jednak wygenerować pliku WSDL dla różnych "namespaces", jakieś sugestie?

Michał Luberda - Venezia 2009.04