Sei sulla pagina 1di 7

DEV DEVeloping Software Solutions n.

127 marzo 2005

WebServices in Perl
di Fausto Zanasi
` Per sviluppare Web Services secondo le speciche SOAP/XML e praticamente necessario usare un toolkit. Il linguaggio Perl offre a questo scopo ` SOAP::Lite: uno strumento degno di nota per semplicita, potenza e completezza

Fausto Zanasi ` E laureato in losoa; autore di testi, docente e consulente, si occupa di sviluppo software dal 1977. Si occupa di OOP , DBMS, reti e ha sviluppato progetti in Java, Delphi, Python, Visual C++ e Visual Basic.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of DEV, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2005 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2005 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di DEV sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2005 Infomedia e rilasciato ` con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2005 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

programmazione Perl
di

Fausto Zanasi > fzanasi@infomedia.it

WebServices in Perl
Per sviluppare Web Services secondo le specifiche SOAP/XML praticamente necessario usare un toolkit. Il linguaggio Perl offre a questo scopo SOAP::Lite: uno strumento degno di nota per semplicit, potenza e completezza
una array (vettore a indice numero), il simbolo % se denota un insieme di coppie chiave/valore. Listruzione package <nomePackage>; serve per creare uno spazio-di-nomi (come in Java): tutte le variabili e le funzioni usate di seguito a questa istruzione gli apparterranno. La parola chiave my viene usata per limitare la visibilit di una variabile allinterno di un ambito quale un file o un blocco. Un modulo un file che contiene un package e il cui nome coincide con quello del package (con estensione .pm). Un oggetto unarea di memoria che conosce a quale classe appartiene. Una classe un modulo che fornisce metodi per operare su oggetti. Un metodo una funzione il cui primo argomento un riferimento ad un oggetto (o a una classe per i metodi statici). La sintassi per applicare metodi ad oggetti riferimentoOggetto->metodo(parametri): la freccia al posto del pi comune punto.

L
Perl

a pigrizia, limpazienza e la tracotanza sono, secondo Larry Wall, il creatore del linguaggio Perl, le tre grandi virt del programmatore. Chi inizia ad occuparsi di WebServices le possiede tutte. Non desidera conoscere i dettagli (una forma di pigrizia); curioso di provare se questa tecnologia mantiene quanto promette (impazienza) e, se cos , vuole fare quello che non mai riuscito a fare prima in modo soddisfacente con un server Web via HTML (tracotanza). Il modulo Perl SOAP::Lite offre unottima risposta a queste esigenze. semplice: nasconde (ma solo se lo si vuole) i dettagli delle specifiche SOAP. potente: bastano poche righe di codice per scrivere client e server SOAP e provarli subito. completo: supporta tutte i pi comuni protocolli di trasposto (HTTP,FTP, POP, ecc..) e le estensioni WSDL, UDDI.

Installazione
Supponiamo che Perl sia gi installato correttamente. Se si ha unaccesso a Internet ed installato il modulo CPAN(.pm) si pu scrivere dal prompt della shell di comandi (DOS per WinX):
perl -MCPAN -e install SOAP::Lite

Il principio fondamentale del linguaggio Perl : ci che semplice deve rimanere tale, ci che difficile deve essere possibile. Spero di riuscire a dimostrare che, per sviluppare WebServices, molto pi facile usare SOAP::Lite che le corrispondenti soluzioni Java e .NET. Perl ha per un altro motto: c pi di un modo di farlo. Si pu rimanere sconcertati dalla variet delle soluzioni espressive di Perl (in quanti modi si pu ottenere lo stesso risultato) rispetto alla semplicit di un altro linguaggio che offre ununica forma, per quanto elegante. Ad uso degli audaci (i virtuosi tracotanti), che decidono che vale la pena di provare questo variopinto linguaggio per godere dei vantaggi di SOAP::Lite, ho preparato la seguente tavola sinottica che riporta ci che bisogna tener presente per (almeno) comprendere il codice Perl. La sintassi , grosso modo, quella del C: il punto-evirgola usato come terminatore di istruzioni, il blocco di istruzioni racchiuso fra parentesi graffe, le istruzioni di assegnazione, if e while hanno lo stesso senso. Perl un linguaggio interpretato e senza tipi di dati: non si usa la dichiarazione di tipo per le variabili; un linguaggio di script dunque. Una variabile un nome di unarea di memoria. Il carattere $ viene preposto alla variabile se questa denota un singolo valore, il carattere @ se denota
>> 54

Questo comando effettua una connessione con il repository dei moduli Perl, il download del software, la configurazione, attraverso la richiesta dei valori per i parametri , e linstallazione. Altrimenti occorre procurarsi il package SOAP::Lite, per esempio presso il sito www.soaplite.com, e procedere come si fa di solito per linstallazione di moduli Perl:
perl Makefile.PL make make test make install

Su piattaforma Winx usare nmake invece di make.

Un primo esempio: un client per Google


La promessa di SOAP linteroperabilit: la possibilt di richiedere (e fornire) servizi fra client e server superando le differenze di piattaforma e implementazione. Google, il pi noto motore di ricerca per Internet, espone dei web services che permettono di utilizzarlo, in modo alternativo ma equipollente a quello usuale via http/html. Le specifiche che li descrivono sono descritte in un file google.wsdl (contenuto in un file zip insieme ad altro materiale) reperibile presso http://www.google.com/apis/ . Inoltre necessario possedere una chiave di registrazione: un codice di tipo stringa che identifica laccreditamento presso google; la si pu otterere sempre presso lo stesso sito. Dopo esserci procurati il file google.wsdl e la chiave di registrazione, scriviamo un programma Perl che sia client SOAP verso i web-services di Google.
DEV > n. 127 marzo 2005

programmazione Perl
WebServices in Perl

use SOAP::Lite; my $key = ************************; # <<< scrivere qui la chiave di registrazione my $query = Marilyn Monroe; my $google = SOAP::Lite>service(file:./GoogleSearch.wsdl); my $result = $google->doGoogleSearch($key, $query, 0, 10, false, , false, , latin1, latin1);

<xsd:element name=startIndex type=xsd:int/> <xsd:element name=endIndex type=xsd:int/> <xsd:element name=searchTips type=xsd:string/> <xsd:element name=directoryCategories type=typens: DirectoryCategoryArray/> <xsd:element name=searchTime type=xsd:double/> </xsd:all> </xsd:complexType>

La prima istruzione prescrive di usare il modulo SOAP::Lite. Le due seguenti impostano i valori delle due variabili $key e $query rispettivamente alla chiave di registrazione e alla stringa di ricerca. Listruzione
my $google = SOAP:: Lite->service(file:./GoogleSearch.wsdl);

istanzia la classe SOAP::Lite utilizzando il metodo service il cui parametro la URL che corrisponde al file wsdl: si ottiene un riferimento $google alloggetto. Listruzione successiva
my $result = $google->doGoogleSearch($key, $query, 0, 10, false, , false, , latin1, latin1);

Loggetto $google (di tipo SOAP::Lite) compie, dietro le quinte, il lavoro di traslazione della risposta da questo formato a una struttura dati Perl referenziata da $result. Si tratta, in questo caso di un array associativo , hash in Perl: un insieme di coppie chiave/valore. Per cui per stampare, per esempio, il valore di estimatedTotalResultsCount si scrive:
print $result->{estimatedTotalResultsCount};

applica il metodo doGoogleSearch alloggetto per effettuare la ricerca. La firma del metodo (numero, ordine e tipo dei parametri) definita sempre nel file google.wsdl in questo modo:
<message name=doGoogleSearch> <part name=key <part name=q <part name=start <part name=maxResults <part name=filter <part name=restrict <part name=safeSearch <part name=lr <part name=ie <part name=oe </message> type=xsd:string/> type=xsd:string/> type=xsd:int/> type=xsd:int/> type=xsd:boolean/> type=xsd:string/> type=xsd:boolean/> type=xsd:string/> type=xsd:string/> type=xsd:string/>

Val la pena di notare che la chiave resultElements ha un valore di un tipo -ResultElementArray - definito, sempre nel file google.wsdl, in questo modo:
<xsd:complexType name=ResultElementArray> <xsd:complexContent> <xsd:restriction base=soapenc:Array> <xsd:attribute ref=soapenc:arrayType wsdl:arrayType=typens:ResultElement[]/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:complexType name=ResultElement> <xsd:all> <xsd:element name=summary type=xsd:string/> <xsd:element name=URL type=xsd:string/> <xsd:element name=snippet type=xsd:string/> <xsd:element name=title type=xsd:string/> <xsd:element name=cachedSize type=xsd:string/> <xsd:element name=relatedInformationPresent type=xsd:boolean/> <xsd:element name=hostName type=xsd:string/> <xsd:element name=directoryCategory type=typens:DirectoryCategory/> <xsd:element name=directoryTitle type=xsd:string/> </xsd:all> </xsd:complexType>

Lesecuzione del metodo comporta la connessione con il server e lo scambio di messaggi SOAP, la richiesta e la risposta. Questultima viene ricevuta nelloriginale formato SOAP definito, sempre nel file google.wsdl, in questo modo:
<message name=doGoogleSearchResponse> <part name=return </message> . <xsd:complexType name=GoogleSearchResult> <xsd:all> <xsd:element name=documentFiltering type=xsd:boolean/> <xsd:element name=searchComments type=xsd:string/> <xsd:element name=estimatedTotalResultsCount type=xsd:int/> <xsd:element name=estimateIsExact type=xsd:boolean/> <xsd:elementname=resultElements type=typens: ResultElementArray/> <xsd:element name=searchQuery type=xsd:string/> type=typens: GoogleSearchResult/>

SOAP::Lite traduce da questo formato in un array a indice numerico di elementi, ognuno dei quali un array associativo. Quindi $result->{resultElements} referenzia larray dei risultati, che si pu scorrere attraverso un ciclo for, e $result>{resultElements}[$i] referenzia lelemento i-esimo che un array associativo che corrisponde al tipo XSD ResultElement. Per esempio listruzione
for ($i = 0; $risultato = $result->{resultElements}[$i]; $i++) { print $risultato->{URL}; }

stampa le URL dei risultati trovati.


55 <<

DEV > n. 127 marzo 2005

programmazione Perl
WebServices in Perl

Un altro breve esempio, a mo di conferma. Un web service, il cui compito restituire il codice fiscale inviando come parametri i dati anagrafici, descrito, in formato wsdl, allindirizzo http://www.pinellus.com/cfc/Cod_fiscale.cfc?wsdl. Lesame di questa risorsa, per esempio via browser, permette di determinare il nome del metodo da chiamare (makecod) e i parametri da passare (cognome, nome ecc). Il programma seguente permette di ottenere il risultato voluto:
use SOAP::Lite; my $cfws = SOAP::Lite->service(http://www. pinellus.com/cfc/Cod_fiscale.cfc?wsdl); my $cf = $cfws->makecod(cognome,nome,sesso, provincia,comune,dataNascita); print $cf

<c-gensym3 xsi:type=xsd:string> richiesta del Client </c-gensym3> </namesp1:sayHello> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

Si noti che il descrittore del servizio non un file wsdl che abbiamo acquistito precedentemente, come nellesempio precedente di Google, ma una risorsa disponibile in rete referenziabile tramite una URL. Limplementazione del ws, sul lato server, nascosta, e quindi irrilevante, per il nostro client: basta che siano rispettate le regole di scambio messaggi secondo il protocollo SOAP. Fin qui fin troppo semplice: cerchiamo di vedere cosa c sotto.

Un esempio completo: client e server


Lestrema semplicit degli esempi precedenti dovuta dalla presenza del file wsdl (Web Service Description Language) che ha la funzione di descrivre compiutamente i servizi che sono esposti da un server. Quando questo file manca, il client, per poter costruire la richiesta, deve conoscere (almeno) 1) chi fornisce il servizio: la URL del server:chiamato anche endpoint in wsdl o proxy nel caso di SOAP::Lite. 2) quale servizio richiedere: lindividuazione, sul lato server, avviene tramite un identificativo composto: un namespace, chiamato uri in SOAP::Lite, e un nome proprio della funzione richiesta allinterno di questo namespace. Per esempio per richiedere a un server, identificato dalla URL http://localhost:1234, il servizio identificato dal namespace Hello e dalla funzione sayHello si scrive il seguente client SOAP::Lite:
use SOAP::Lite; $client = SOAP::Lite -> proxy(http://localhost:1234); $risposta = $client->uri(urn:Hello) -> sayHello (richiesta del Client); print $risposta->result;

che forse potr impressionare chi non conosce le specifiche SOAP/XML ma, grazie al nostro toolkit, tutto ci resta opportunamente nascosto. Ci che importa notare il contenuto dellelemento SOAP-ENV:Body. Vi si trova la codifica del richiamo della funzione: un elemento di nome sayHello il cui namespace abbreviato namesp1 che corrisponde, tramite lattributo xmlns:namesp1 a Hello. Il protocollo SOAP definisce esclusivamente il formato delle richieste e delle risposte dei servizi che il client e il server si scambiano, che sono cio specifici dellapplicazione. Ma indifferente, e non pone alcuna condizione, sul protocollo usato per trasportare questi messaggi che pu essere indifferentemente HTTP, FTP, SMTP/POP3 o altro. HTTP comunque quello pi usato perch opera gi in modalit richiesta/risposta, che quella propria di SOAP. SOAP::Lite, sul lato client , identifica il protocollo da usare a partire dalla URL del parametrro proxy: nellesempio precedente http e quindi viene istanziato un oggetto a partire dal modulo SOAP::Transport::HTTP::Client che incapsula la precente richiesta SOAP/XML in un prologo HTTP e gestisce linvio al server:
SOAP::Transport::HTTP::Client::send_receive: POST http://CHAOS:9080 Accept: text/xml Accept: multipart/* Content-Length: 505 Content-Type: text/xml; charset=utf-8 SOAPAction: urn:Hello#sayHello <segue richesta SOAP/XML>

Sul lato server la richiesta SOAP/XML viene presa in carico, in ultima istanza, da quello che chiameremo nel seguito SOAPServer. Ma, simmetricamente a quanto accade sul lato client, nemmeno il SOAP-Server si occupa di gestire il trasporto dei messaggi. Quindi viene collegato, come estensione attivabile alla bisogna, a un server che compie questa funzione: tipicamente il SOAP-Server opera come estensione CGI a un WebServer, per esempio Apache. SOAP::Lite permette per di ottenere un SOAP Server che implementi anche il protocollo di trasposto HTTP e agisca quindi come demone, ponendosi in ascolto delle richieste in arrivo su una determinata porta. Occorre creare un oggetto istanza della classe SOAP::Transport::HTTP:: Daemon
use SOAP::Transport::HTTP;

SOAP::Lite costruisce la seguente richiesta in formato SOAP/XML


<?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope xmlns:xsi=http://www.w3.org/1999/XMLSchema-instance xmlns:SOAP-ENC=http://schemas.xmlsoap.org/soap/encoding/ xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd=http://www.w3.org/1999/XMLSchema SOAP-ENV:encodingStyle=http:// schemas.xmlsoap.org/soap/encoding/> <SOAP-ENV:Body> <namesp1:sayHello xmlns:namesp1=urn:Hello>

my $SoapServer = SOAP::Transport::HTTP::Daemon ->new (LocalPort => 1234);

Il SOAP-Server riceve, dunque, la richiesta di un servizio identificato da un namespace (parametro uri del client) e da un nome di funzione. A questo punto SOAP::Lite agisce cos: ricerca un modulo Perl (file con estensione pm) che abbia un nome uguale al namespace. Per specificare dove il SOAPServer deve cercare il modulo, occorre usare il metodo dispatch_to che ha come argomento la directory dove si trovano i moduli che implementano i servizi:
$SoapServer -> dispatch_to(/home/httpd/soap_modules/);

>> 56

DEV > n. 127 marzo 2005

programmazione Perl
WebServices in Perl

# per Win32 : $SoapServer -> dispatch_to(C:\\miaDir\\moduliSoap)

print $risposta->result;

producono : Inoltre, deve mettersi in attesa delle eventuali richeste dei client. Questo si ottiene con il metodo handle
$SoapServer ->handle; Risposta a: richiesta del Client

Il programma sul lato server cos completo. Supponiamo che in /home/httpd/soap_modules/ si trovi Hello.pm il cui contenuto sia:
package Hello; sub sayHello { my($refOggetto, $parametroDalClient) = @_; return Risposta a: . $parametroDalClient; } 1;

Le due attivit simmetriche, che permettono di passare dal messaggio SOAP/XML alloggetto Perl e dal richiamo di un metodo a un messaggio SOAP/XML, sono chiamate serializzazione e deserializzazione. Entrambe sono svolte da SOAP::Lite in modo autonomo. Il programmatore si limita, sul lato client, a istanziarne un oggetto fornendo il necessario parametro proxy e a richedere a questultimo i servizi. Sul lato server a istanziare un oggetto che riceve la richiesta, la deserializza e la riindirizza alla classe/metodo specificati. Come si detto, c pi di un modo per farlo (in Perl). Sul lato client, per esempio si pu operare in modalit autodispatch , aggiungendo questo parametro al richiamo del modulo:
use SOAP::Lite +autodispatch;

Secondo la via Perl allObject Oriented questa (anche) una classe con la definizione di un metodo sayHello. Il programma SOAP-Server, a seguito della richiesta, carica questa classe, l istanzia ed esegue sulloggetto ottenuto il metodo sayHello passandogli il parametro che riceve dal client. Si noti che creata una nuova istanza per ogni richiesta del (dei) client e queste istanze sono reciprocamente indipendenti. Il risultato viene ricodificato in un messaggio SOAP/XML che viene rinviato al client. Di seguito viene mostrato questo messaggio insieme al suo prologo HTTP:
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Date: Sat, 24 May 2003 16:28:53 GMT Server: libwww-perl-daemon/1.26 Content-Length: 527 Content-Type: text/xml; charset=utf-8 Client-Date: Sat, 24 May 2003 16:28:53 GMT Client-Peer: 127.0.0.1:9080 Client-Response-Num: 1 SOAPServer: SOAP::Lite/Perl/0.55 <?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope xmlns:xsi=http://www.w3.org/1999/XMLSchema-instance xmlns:SOAP-ENC=http://schemas.xmlsoap.org/soap/encoding/ xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd=http://www.w3.org/1999/XMLSchema SOAP-ENV:encodingStyle=http:// schemas.xmlsoap.org/soap/encoding/> <SOAP-ENV:Body> <namesp2:sayHelloResponse xmlns:namesp2=urn:Hello> <s-gensym6 xsi:type=xsd:string>Risposta a: richiesta del Client </s-gensym6> </namesp2:sayHelloResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

Quando questa modalit abilitata, i metodi che non sono disponibili localmente sono automaticamente inviati al SOAP-Server e l eseguiti. Il programma client dellesempio precedente diventa
use SOAP::Lite +autodispatch; $client = SOAP::Lite -> proxy(http://localhost:9080); $HelloObj = $client->uri(urn:Hello); $risposta = $HelloObj->sayHello(richiesta del Client) print $risposta->result();

Loggetto $HelloObj costituisce un rappresentante locale delloggetto remoto, istanza della classe remota Hello. Il metodo sayHello viene eseguito sul server. Sul lato server, spesso si ricorre a un Web Server che gestisca lo scambio dei messaggio usando il protocollo di trasporto HTTP. In questo caso il SOAP-Server si pone come estensione in modalit CGI. Occorre istanziare un oggetto della classe SOAP::Transport::HTTP::CGI:
use SOAP::Transport::HTTP; my $SoapServer = SOAP::Transport::HTTP::CGI->new(); $SoapServer -> dispatch_to(/home/httpd/soap_modules/); $SoapServer -> handle;

Questo programma deve essere fruibile, in modalit cgi dal WebServer: il modo varia in funzione di quale WebServer si sta usando (Apache, IIS).

Debug
Quando si dichiara di usare il modulo SOAP::Lite possibile attivare la modalit di debug in questo modo:
use SOAP::Lite +debug;

Il client che riceve la risposta in formato SOAP/XML la trasforma in un oggetto Perl. Lesecuzione delle due istruzioni, del client SOAP::Lite esposto precedentemente
$risposta = $client->uri(urn:Hello) -> sayHello(richiesta del Client);

Questo ha leffetto di produrre sul file STDERR (standard error: usalmente lo screen) i messaggi che documentano gli eventi che accadono durante lesecuzione del programma (per quanto concerne lattivit di SOAP::Lite). Non tutti gli eventi sono rilevanti sia per il client che per il server. La Tabella 1 mostra lelenco dei principali eventi / ruoli / significati. possibile far seguire al paramtero +debug la lista degli eventi che si desidera riportare, per esempio
use SOAP::Lite +debug => (transport, objects);

DEV > n. 127 marzo 2005

57 <<

programmazione Perl
WebServices in Perl

TABELLA 1
Evento transport dispatch result parameters headers objects fault Client o Server? Client Server Server Server Server Client e Server Client e Server Significato Luso degli oggetti HTTP::Request e HTTP::Response durante il trasporto dei messaggi SOAP Mostra il nome completo della chiamata del WS : modulo/metodo Da il risultato della chiamata al metodo Mostra i parametri della chiamata al metodo Restituisce gli header del messaggio ricevuto Istanziazione e distruzione degli oggetti Eccezione nellesecuzione

Inoltre possibile associare agli eventi delle funzioni invocate al loro accadere, in modalit callback. Per esempio se aggiungiamo al precedente programma SOAPServer :
use SOAP::Lite +debug => [result => \&conta_accessi]; my $numeroAccessi = 0; sub conta_accessi { $numeroAccessi++; print Accesso numero $numeroAccessi .\n; }

Bibliografia e riferimenti
[1] Randy j.Ray,Pavel Kulchenko, Programming Web Services with Perl, OReilly 2001 [2] James Snell, Doug Tidwell & Pavel Kulchenko, Programming Web Services with SOAP, OReilly 2001 [3] http://www.soaplite.com, il sito ufficiale si SOAP::Lite.

Fausto Zanasi
laureato in filosofia; autore di testi, docente e consulente, si occupa di sviluppo software dal 1977. Si occupa di OOP, DBMS, reti e ha sviluppato progetti in Java, Delphi, Python, Visual C++ e Visual Basic.

Otteniamo il log che riporta il numero dordine di ogni richiesta del web service.

PHP-RESIDENCE

a cura di Gianluca Masina > gmasina@infomedia.it

Questo mese andiamo ad esaminare un sistema web per la gestione alberghiera

Italian Free

Un progetto che mi ha colpito particolarmente Php-Residence, un sistema per la gestione di hotel direttamente via WEB - realizzato da Marco De Santis. Come si pu facilmente intuire, Php-Residence stato sviluppato in PHP e rilasciato sotto licenza GPL. I sorgenti possono essere prelevati liberamente dal sito ufficiale; possibile visionare una demo per farsi unidea della bont del prodotto direttamente dal sito. Per provare lapplicazione anche sul proprio PC si deve configurare un ambiente di test; quindi sono necessarie le installazioni di un WEB SERVER e un DBMS come contenitore dati (come MySql). Php-Residence pu essere utilizzato sia sotto Windows (in questo caso sar necessario installare un PHP Engine come ad esempio Easyphp) che Linux. Lautore ha avuto il grande merito di essersi preoccupato anche della localizzazione in modo da poter rivolgersi ad una maggiore utenza possibile; si possono scegliere tra ben quattro lingue: italiano, inglese, spagnolo, tedesco. Durante il primo utilizzo si devono impostare alcuni parametri (come il collegamento al DB, lindirizzo dove risiede il WEB SERVER ecc.) dopodich si passano ad impostare le componenti tipiche di un hotel come le tariffe o le regole per la gestione delle prenotazioni. Il sistema su cui si poggia Php-Residence permette di verificare

sulle varie postazioni, in tempo reale, se ad esempio le camere sono disponibili oppure indirizzare i clienti verso altri hotel della stessa catena. Le varie pagine dispongono di un buon numero di funzionalit soprattutto legate alle prenotazioni; stato realizzato un completo sistema di regolazione per lassegnazione automatica delle camere in base al numero di componenti per prenotazione (sul sito ufficiale presente una pagina che approfondisce il concetto). E possibile anche inserire e modificare in qualsiasi momento i dati dei clienti (come la tariffa e la camera associate); la formattazione dei dati contenuti nelle tabelle rende pi comoda la consultazione permettendo di avere dei riepiloghi annuali. Si possono memorizzare inoltre dei promemoria, verificare i costi di gestione per quanto riguarda le entrate/uscite della propria attivit con tanto di storico e bilancio. Abbiamo avuto modo di contattare Marco che ha tenuto a dire: Php-residence stato il mio primo progetto in assoluto, iniziai a lavorarci nel 2000. Avendo lesigenza di gestire alcune case vacanza assieme a dei familiari sparsi in varie localit, qualcosa di accessibile via web era lideale e cos colsi loccasione di un tutorial sul php pubblicato da una rivista. Le sue funzionalit sono dunque rivolte pi alla gestione che alle prenota-

zioni online, anche se ora possibile controllare la disponibilit via internet. La caratteristica principale che lo contraddistingue, anche rispetto a prodotti commerciali, lassegnazione automatica degli appartamenti alle prenotazioni. Al momento della scrittura dellarticolo PhpResidence penalizzato dallo stile grafico utilizzato, che se pur semplice, non rende giustizia ad un buon prodotto (secondo il mio modesto parere). In particolare i pulsanti presenti nelle varie schermate sono sistemati in maniera a dir poco confusionaria rendendo difficoltoso lutilizzo ad utenti meno esperti. Marco, tra laltro sempre molto disponibile, non ha esitato a comunicarci che sta prendendo in considerazione una profonda modifica dellinter faccia per far ottenere a PhpResidence la giusta consacrazione. Per ulteriori informazioni rimando al link del sito ufficiale.
http://www.digitaldruid.net/ php-residence/

Ricordiamo che per le proposte si pu fare riferimento allindirizzo dellautore, includendo una descrizione del progetto e il relativo URL dove poter effettuare il download. Le segnalazioni ritenute di interesse saranno prese in considerazione dalla redazione. DEV > n. 127 marzo 2005

>> 58

Potrebbero piacerti anche