WSDL w PHP
by yaras on May.02, 2010, under Soap
Witam wszystkich po dość długiej przerwie, po której chciałbym podzielić się kolejnymi spostrzeżeniami i pomysłami
.
Dziś chciałbym zająć się technologią zgoła odmienną od .NET – mianowicie PHP. Framework .NET udostępnia nam bardzo wygodne środowisko do tworzenia WebService’ów – Windows Communication Foundation. Miałem kiedyś sposobność współtworzenia dość sporawej aplikacji wykorzystującej WCF’a i muszę przyznać, że jest to jedno z lepszych rozwiązań z jakimi się spotkałem. Problem powstaje jednak, gdy chcemy swoją aplikację udostępnić w Internecie. Znalezienie hostingu udostępniającego WCF’a nie jest może takie trudne, natomiast jego cena może skutecznie odstraszyć potencjalnego nabywcę. Hosting Windows Server jest, z wiadomych względów, droższy od hostingów linuksowych, co zatem przemawia na ich korzyść. Jeśli więc nie potrzebujemy zaawansowanych WebService’ów to warto zainteresować się właśnie PHP i biblioteką NuSOAP.
Czym w ogóle są webserwisy i po co nam one? Webserwisy (inaczej usługi sieciowe) to aplikacje udostępniające za pomocą protokołu SOAP interfejs, do którego mogą podłączyć się inne, niezależne platformowo, aplikacje. Dzięki temu możemy w prosty sposób budować duże, rozproszone aplikacje zapewniając przy tym spójność przesyłanych danych. Nic nie stoi więc na przeszkodzie, by przygotować na linuksie webserwis w php, łączący się za pomocą PDO z bazą danych MySQL, z którego będzie korzystać WPF’owa aplikacja windowsowa. Przy czym ta ostatnia nawet nie będzie wiedzieć czy jej dane przechowywane są w bazie danych, pliku tekstowym czy pamięci operacyjnej.
Co będzie nam potrzebne? Jako iż korzystamy z php’owej biblioteki to oczywiście hosting z zainstalowanym php (ja testowałem na wersji 5), biblioteka NuSOAP oraz Visual Studio (do przygotowania aplikacji testowej).
Pierwszy webserwis w PHP.
Na początek stwórzmy coś na prawdę prostego, np. webserwis zawierający metodę HelloWorld(), która jako argument przyjmuje imię użytkownika i zwraca ciąg “Hello [imię]!”. Szkielet naszego serwisu będzie wyglądał następująco:
<?php
require_once("lib/nusoap.php");
$namespace = "http://yaras.pl";
$server = new soap_server();
$server->configureWSDL("WorkerService");
$server->wsdl->schemaTargetNamespace = $namespace;
$server->soap_defencoding='utf-8';
$server->xml_encoding = "utf-8";
$server->service($HTTP_RAW_POST_DATA);
?>
Myślę, że kod jest na tyle jasny, że nie muszę wiele wyjaśniać. W linii 5 tworzymy nowy obiekt klasy soap_server, w linii 6 mówimy serwisowi, by udostępniał swoje usługi jako WSDL (co pozwoli nam je skonsumować przez naszą aplikację), następnie ustawiamy namespace oraz kodowanie. Zapiszmy powyższy kod jako index.php. Po wpisaniu w przeglądarkę adresu naszej strony oraz index.php?wsdl naszym oczom powinien ukazać się mniej więcej taki dokument:
<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions ...>
<types>
<xsd:schema ...>
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema>
</types>
<message name="HelloWorldRequest">
<part name="name" type="xsd:string" /></message>
<message name="HelloWorldResponse">
<part name="return" type="xsd:string" /></message>
<portType name="WorkerServicePortType">
<operation name="HelloWorld">
<documentation>Says hello to webservice</documentation>
<input message="tns:HelloWorldRequest"/>
<output message="tns:HelloWorldResponse"/>
</operation>
</portType>
<binding name="WorkerServiceBinding" type="tns:WorkerServicePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="HelloWorld">
<soap:operation soapAction=".../index.php/HelloWorld" style="rpc"/>
<input><soap:body use="literal" namespace="..."/></input>
<output><soap:body use="literal" namespace="..."/></output>
</operation>
</binding>
<service name="WorkerService">
<port name="WorkerServicePort" binding="tns:WorkerServiceBinding">
<soap:address location=".../index.php"/>
</port>
</service>
</definitions>
Nie zagłębiając się w szczegóły powyższy xml opisuje interfejs dostępu do naszej usługi sieciowej. Dzięki niemu dowolna aplikacja obsługująca WSDL może z niej korzystać.
Aplikacja testowa.
Utwórzmy następnie prostą aplikację konsolową w Visual Studio (może to być dowolna aplikacja, dla prostoty niech będzie to jednak aplikacja konsolowa). Po utworzeniu ConsoleApplication w SolutionExplorer dodajemy nowy Service Reference.
W oknie Add Service Reference podajemy adres naszego webserwisu pamiętając, by na końcu dodać ?wsdl. Po kliknięciu Go Visual Studio spróbuje połączyć się z naszym serwisem i pobrać listę operacji.
Po wybraniu Namespace i zatwierdzeniu na liście w sekcji Service References znajdzie się nasz webserwis. Od tego momentu w dowolnym miejscu aplikacji możemy z niego korzystać, np.:
WorkerServicePortTypeClient client = new WorkerServicePortTypeClient();
Console.WriteLine(client.HelloWorld("John Doe"));
Jeśli ten etap zadziałał, to najważniejszą część mamy już za sobą
.
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.