yaras.pl

WSDL w PHP

by 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

:, , ,

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...