WebServices in Perl

8
 DEV DEV eloping Soft ware Solu tions — n. 127 — marzo 2005 WebServices in Perl di Fausto Zanasi Per sviluppare Web Services secondo le speciche SOAP/XML  ` e pratica- mente necessario usare un toolkit. Il linguaggio Perl offre a questo scopo SOAP::L ite: uno strumento degno di nota per semplicit ` a, potenza e completezza Fausto Zanasi ` E laureato in losoa; autore di testi , docent e e consulente, si occupa di sviluppo software dal 1977. Si occupa di OOP , DBMS, reti e ha svilup- pato progetti in Java, Delphi, Python, Visual C++ e Visual Basic.

description

DEV DEVeloping Software Solutions — n. 127 — marzo 2005WebServices in Perldi Fausto ZanasiPer sviluppare Web Services secondo le specifiche 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 completezzaFausto 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

Transcript of WebServices in Perl

Page 1: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 1/7

DEV DEVeloping Software Solutions — n. 127 — marzo 2005

WebServices in Perldi Fausto Zanasi

Per sviluppare Web Services secondo le specifiche SOAP/XML e pratica-mente necessario usare un toolkit. Il linguaggio Perl offre a questo scopoSOAP::Lite: uno strumento degno di nota per semplicita, potenza e completezza

Fausto Zanasi

E laureato in filosofia;autore di testi, docentee consulente, si occupa

di sviluppo software dal1977. Si occupa di OOP,DBMS, reti e ha svilup-pato progetti in Java,Delphi, Python, VisualC++ e Visual Basic.

Page 2: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 2/7

pubblicato su

WWW.INFOMEDIA.IT

stampa digitale da

Lulu Enterprises Inc.

stores.lulu.com / infomedia

Infomedia

Infomedia e l’impresa editoriale che da quasi venti an-

ni ha raccolto la voce dei programmatori, dei sistemi-

sti, dei professionisti, degli studenti, dei ricercatori e dei

professori d’informatica italiani.

Sono piu di 800 gli autori che hanno realizzato per le te-

state Computer Programming, Dev, Login, Visual Basic

Journal e Java Journal, molte migliaia di articoli tecnici,

presentazioni di prodotti, tecnologie, protocolli, strumen-ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-

tagemmi. Oltre 6 milioni di copie distribuite, trentamila

pagine stampate, fanno di questa impresa la piu grande ed

influente realta dell’editoria specializzata nel campo della

programmazione e della sistemistica.

In tutti questi anni le riviste Infomedia hanno vissuto del-

la passione di quanti vedono nella programmazione non

solo la propria professione ma un’attivita vitale e un vero

divertimento.

Nel 2009, Infomedia e cambiata radicalmente adottando

un nuovo modello aziendale ed editoriale e si e organiz-

zata attorno ad una idea di Impresa Sociale di Comunita,

partecipata da programmatori e sistemisti, separando le

attivita di gestione dell’informazione gestite da un board

comunitario professionale e quelle di produzione gesti-

te da una impresa strumentale. Questo assetto e in linea

con le migliori esperienze internazionali e rende Infome-

dia ancora di piu parte della Comunita nazionale degli

sviluppatori di software.

Infomedia e media-partner di manifestazioni ed eventi in

ambito informatico, collabora con molti dei pi u impor-tanti editori informatici italiani come partner editoriale e

fornitore di servizi di localizzazione in italiano di testi in

lingua inglese.

L’impaginazione 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 ar-

ticle 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 so-

no riportate nella sezione “Copyright” alla fine di cia-

scun 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 con-

tenuto 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 tota-

le dei testi e delle immagini per scopo didattico purch´ e

vengano integralmente citati gli autori e la completa

identificazione della testata.

 Manoscritti e foto originali, anche se non pubblicati, non

si restituiscono.

Contenuto pubblicitario inferiore al 45%.

  La biografia dell’autore riportata nell’articolo e sul

sito www.infomedia.it e di norma quella disponibi-

le nella stampa dell’articolo o aggiornata a cu-

ra dell’autore stesso. Per aggiornarla scrivere a

[email protected] o farlo in autonomia all’indirizzo

http: // mags.programmers.net  / moduli / biografia

Page 3: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 3/7

di Fausto Zanasi > [email protected]

54 DEV > n. 127 marzo 2005>>

programmazione Perl

Per sviluppare Web Services secondo 

le specifiche SOAP/XML è pratica- 

mente necessario usare un toolkit. Il 

linguaggio Perl offre a questo scopo 

SOAP::Lite: uno strumento degno di 

nota per semplicità, potenza e com- 

pletezza 

La pigrizia, l’impazienza e la tracotanza sono,secondo Larry Wall, il creatore del linguaggioPerl, le tre grandi virtù del programmatore. Chiinizia ad occuparsi di WebServices le possiedetutte. Non desidera conoscere i dettagli (unaforma di pigrizia); è curioso di provare se que-

sta tecnologia mantiene quanto promette (impazienza) e, seè così , vuole fare quello che non è mai riuscito a fare primain modo soddisfacente con un server Web via HTML (traco-tanza).Il modulo Perl SOAP::Lite offre un’ottima risposta a questeesigenze. È semplice: nasconde (ma solo se lo si vuole) idettagli delle specifiche SOAP. È potente: bastano poche

righe di codice per scrivere client e server SOAP e provar-li subito. È completo: supporta tutte i più comuni protocol-li di trasposto (HTTP,FTP, POP, ecc..) e le estensioni WSDL,UDDI.

PerlIl principio fondamentale del linguaggio Perl è: ciò che èsemplice deve rimanere tale, ciò che è difficile deve esserepossibile. Spero di riuscire a dimostrare che, per sviluppare WebServices, è molto più facile usare SOAP::Lite che le cor-rispondenti soluzioni Java e .NET. Perl ha però un altromotto: c’è più di un modo di farlo. Si può rimanere scon-certati dalla varietà delle soluzioni espressive di Perl (inquanti modi si può ottenere lo stesso risultato) rispetto alla

semplicità di un altro linguaggio che offre un’unica forma,per quanto elegante.  Ad uso degli audaci (i “virtuosi tracotanti”), che decidonoche vale la pena di provare questo “variopinto” linguaggioper godere dei vantaggi di SOAP::Lite, ho preparato laseguente tavola sinottica che riporta ciò che bisogna tenerpresente per (almeno) comprendere il codice Perl.

• La sintassi è, grosso modo, quella del C: il punto-e-  virgola è usato come terminatore di istruzioni, ilblocco di istruzioni è racchiuso fra parentesi graffe,le istruzioni di assegnazione, if e while hanno lostesso senso.

• Perl è un linguaggio interpretato e senza tipi di dati:

non si usa la dichiarazione di tipo per le variabili; unlinguaggio di script dunque.• Una variabile è un nome di un’area di memoria. Il

carattere $ viene preposto alla variabile se questadenota un singolo valore, il carattere @ se denota

una array (vettore a indice numero), il simbolo % sedenota un insieme di coppie chiave/valore.

• L’istruzione   package <nomePackage>; serve percreare uno spazio-di-nomi (come in Java): tutte le variabili e le funzioni usate di seguito a questa istru-zione gli apparterranno. La parola chiave my  vieneusata per limitare la visibilità di una variabile all’in-terno di un ambito quale un file o un blocco. Unmodulo è un file che contiene un package e il cuinome coincide con quello del package (con esten-sione .pm).

• Un oggetto è un’area di memoria che “conosce” aquale classe appartiene. Una classe è un modulo chefornisce metodi per operare su oggetti. Un metodo èuna funzione il cui primo argomento è un riferimen-to ad un oggetto (o a una classe per i metodi stati-ci). La sintassi per applicare metodi ad oggetti èriferimentoOggetto->metodo(parametri) : la freccia alposto del più comune punto.

InstallazioneSupponiamo che Perl sia già installato correttamente. Se siha un’accesso a Internet ed è installato il moduloCPAN(.pm) si può scrivere dal prompt della shell di coman-di (DOS per WinX):

perl -MCPAN -e ‘install SOAP::Lite’

Questo comando effettua una connessione con il repository dei moduli Perl, il download del software, la configurazio-ne, attraverso la richiesta dei valori per i parametri , e l’in-stallazione.  Altrimenti occorre procurarsi il package SOAP::Lite, peresempio presso il sito www.soaplite.com, e procedere comesi fa di solito per l’installazione 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 GoogleLa promessa di SOAP è l’interoperabilità: la possibiltà di richie-dere (e fornire) “servizi” fra client e server superando le diffe-renze di piattaforma e implementazione. Google, il più notomotore di ricerca per Internet, espone dei web services chepermettono di utilizzarlo, in modo alternativo ma equipollen-te a quello usuale via http/html. Le specifiche che li descrivo-no sono descritte in un file google.wsdl  (contenuto in un filezip insieme ad altro materiale) reperibile pressohttp://www.google.com/apis/ . Inoltre è necessario possedere

una chiave di registrazione: un codice di tipo stringa che iden-tifica l’accreditamento presso google; la si può otterere semprepresso lo stesso sito. Dopo esserci procurati il file google.wsdle la chiave di registrazione, scriviamo un programma Perl chesia client SOAP verso i web-services di Google.

 WebServices in Perl

Page 4: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 4/7

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’);

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 allastringa di ricerca. L’istruzione

my $google = SOAP::

Lite->service(‘file:./GoogleSearch.wsdl’);

istanzia la classe SOAP::Lite utilizzando il metodo service ilcui parametro è la URL che corrisponde al file wsdl: si ottie-ne un riferimento $google all’oggetto. L’istruzione successiva

my $result = $google->doGoogleSearch($key, $query,

0, 10, ‘false’, ‘’, ‘false’, ‘’, ‘latin1’, ‘latin1’);

applica il metodo doGoogleSearch all’oggetto per effettuare laricerca. La “firma” del metodo (numero, ordine e tipo dei para-metri) è definita sempre nel file google.wsdl in questo modo:

<message name=”doGoogleSearch”>

<part name=”key” type=”xsd:string”/>

<part name=”q” type=”xsd:string”/>

<part name=”start” type=”xsd:int”/>

<part name=”maxResults” type=”xsd:int”/>

<part name=”filter” type=”xsd:boolean”/>

<part name=”restrict” type=”xsd:string”/>

<part name=”safeSearch” type=”xsd:boolean”/>

<part name=”lr” type=”xsd:string”/>

<part name=”ie” type=”xsd:string”/>

<part name=”oe” type=”xsd:string”/>

</message>

L’esecuzione del metodo comporta la connessione con ilserver e lo scambio di messaggi SOAP, la richiesta e la rispo-sta. Quest’ultima viene ricevuta nell’originale formato SOAPdefinito, sempre nel file google.wsdl, in questo modo:

<message name=”doGoogleSearchResponse”>

<part name=”return” type=”typens:GoogleSearchResult”/>

</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”/>

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

L’oggetto $google (di tipo SOAP::Lite) compie, dietro lequinte, il lavoro di traslazione della risposta da questo for-mato a una struttura dati Perl referenziata da $result. Si trat-ta, in questo caso di un array associativo , hash in Perl: uninsieme di coppie chiave/valore. Per cui per stampare, peresempio, il valore di estimatedTotalResultsCount si scrive:

print $result->{‘estimatedTotalResultsCount’};

  Val la pena di notare che la chiave resultElements  ha un valore di un tipo -ResultElementArray - definito, sempre nelfile 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>

SOAP::Lite traduce da questo formato in un array a indicenumerico di elementi, ognuno dei quali è un array associa-tivo. Quindi $result->{‘resultElements’} referenzia l’array deirisultati, che si può scorrere attraverso un ciclo for, e $result- 

>{‘resultElements’}[$i] referenzia l’elemento i-esimo che è unarray associativo che corrisponde al tipo XSD ResultElement .Per esempio l’istruzione

for ($i = 0; $risultato =

$result->{‘resultElements’}[$i]; $i++) {print $risultato->{‘URL’};

}

stampa le URL dei risultati trovati.

DEV > n. 127 marzo 2005 55 <<

 WebServices in Perl

programmazione Perl

Page 5: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 5/7

Un altro breve esempio, a mo’ di conferma. Un web service,

il cui compito è restituire il codice fiscale inviando come para-

metri i dati anagrafici, è descrito, in formato wsdl, all’indiriz-

zo http://www.pinellus.com/cfc/Cod_fiscale.cfc?wsdl. L’esa-

me di questa risorsa, per esempio via browser, permette dideterminare 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

Si noti che il descrittore del servizio non è un file wsdl che

abbiamo acquistito precedentemente, come nell’esempio

precedente di Google, ma una risorsa disponibile in rete

referenziabile tramite una URL. L’implementazione del ws,

sul lato server, è nascosta, e quindi irrilevante, per il nostro

client: basta che siano rispettate le regole di scambio mes-

saggi secondo il protocollo SOAP. Fin qui è fin troppo sem-

plice: cerchiamo di vedere cosa c’è sotto.

Un esempio completo: client e serverL’estrema 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:chiamatoanche “endpoint” in wsdl o “proxy” nel caso di

SOAP::Lite.

2) quale servizio richiedere: l’individuazione, sul lato

server, avviene tramite un identificativo composto:

un namespace, chiamato “uri” in SOAP::Lite, e un

nome “proprio” della funzione richiesta all’interno di

questo namespace.

Per esempio per richiedere a un server, identificato dalla

URL http://localhost:1234, il servizio identificato dal name-

space 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;

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

<c-gensym3 xsi:type=”xsd:string”> richiesta

del Client </c-gensym3>

</namesp1:sayHello>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

che forse potrà impressionare chi non conosce le specifiche

SOAP/XML ma, grazie al nostro toolkit, tutto ciò resta oppor-

tunamente nascosto. Ciò che importa notare è il contenuto

dell’elemento 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

l’attributo xmlns:namesp1 a Hello . Il protocollo SOAP defini-

sce esclusivamente il formato delle richieste e delle risposte

dei servizi che il client e il server si scambiano, che sono cioè

specifici dell’applicazione.

Ma è indifferente, e non pone alcuna condizione, sul proto-

collo 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 : nell’esempio 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 l’invio 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 SOAP-

Server. 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: tipica-

mente il SOAP-Server opera come estensione CGI a un Web-

Server, 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, ponendosiin ascolto delle richieste in arrivo su una determinata porta.

Occorre creare un oggetto istanza della classe

SOAP::Transport::HTTP:: Daemon

use SOAP::Transport::HTTP;

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 meto-do dispatch_to che ha come argomento la directory dove si

trovano i moduli che implementano i servizi:

$SoapServer -> dispatch_to(‘/home/httpd/soap_modules/’);

 WebServices in Perl

56 DEV > n. 127 marzo 2005>>

programmazione Perl

Page 6: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 6/7

# per Win32 : $SoapServer

-> dispatch_to(‘C:\\miaDir\\moduliSoap’)

Inoltre, deve mettersi in attesa delle eventuali richeste dei

client. Questo si ottiene con il metodo handle

$SoapServer ->handle;

Il programma sul lato server è così completo. Supponiamoche in  /home/httpd/soap_modules/ si trovi Hello.pm  il cuicontenuto sia:

package Hello;

sub sayHello {

my($refOggetto, $parametroDalClient) = @_;

return “Risposta a: “ . $parametroDalClient;

}

1;

Secondo la “via” Perl all’Object Oriented questa è (anche)una classe con la definizione di un metodo sayHello . Il pro-gramma SOAP-Server, a seguito della richiesta, carica questaclasse, l’ istanzia ed esegue sull’oggetto ottenuto il metodosayHello passandogli il parametro che riceve dal client. Sinoti che è creata una nuova istanza per ogni richiesta del(dei) client e queste istanze sono reciprocamente indipen-denti.Il risultato viene ricodificato in un messaggio SOAP/XMLche viene rinviato al client.Di seguito viene mostrato questo messaggio insieme al suoprologo 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>

Il client che riceve la risposta in formato SOAP/XML la tra-

sforma in un oggetto Perl. L’esecuzione delle due istruzioni,del client SOAP::Lite esposto precedentemente

$risposta = $client->uri(‘urn:Hello’)

-> sayHello(“richiesta del Client”);

print $risposta->result;

producono :

Risposta a: richiesta del Client

Le due attività simmetriche, che permettono di passare dalmessaggio SOAP/XML all’oggetto Perl e dal richiamo di unmetodo a un messaggio SOAP/XML, sono chiamate serializza-zione e deserializzazione. Entrambe sono svolte da SOAP::Litein modo autonomo. Il programmatore si limita, sul lato client,a istanziarne un oggetto fornendo il necessario parametro proxy e a richedere a quest’ultimo i servizi. Sul lato server aistanziare un oggetto che riceve la richiesta, la deserializza e lariindirizza alla classe/metodo specificati. Come si è detto, c’èpiù di un modo per farlo (in Perl). Sul lato client, per esempiosi può operare in modalità autodispatch , aggiungendo questoparametro al richiamo del modulo:

use SOAP::Lite +autodispatch;

Quando questa modalità è abilitata, i metodi che non sonodisponibili localmente sono automaticamente inviati alSOAP-Server e là eseguiti. Il programma client dell’esempioprecedente 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();

L’oggetto $HelloObj costituisce un rappresentante locale del-

l’oggetto remoto, istanza della classe remota Hello . Il meto-do sayHello  viene eseguito sul server. Sul lato server, spes-so si ricorre a un Web Server che gestisca lo scambio deimessaggio usando il protocollo di trasporto HTTP. In questocaso il SOAP-Server si pone come estensione in modalitàCGI. Occorre istanziare un oggetto della classeSOAP::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 sista usando (Apache, IIS…).

DebugQuando si dichiara di usare il modulo SOAP::Lite è possibi-le attivare la modalità di debug in questo modo:

use SOAP::Lite +debug;

Questo ha l’effetto di produrre sul file STDERR (standarderror: usalmente lo screen) i messaggi che documentano glieventi che accadono durante l’esecuzione del programma(per quanto concerne l’attività di SOAP::Lite). Non tutti glieventi sono rilevanti sia per il client che per il server.

La Tabella 1 mostra l’elenco dei principali eventi / ruoli /significati. È possibile far seguire al paramtero +debug  lalista degli eventi che si desidera riportare, per esempio

use SOAP::Lite +debug => (“transport”, “objects”);

DEV > n. 127 marzo 2005 57 <<

 WebServices in Perl

programmazione Perl

Page 7: WebServices in Perl

5/12/2018 WebServices in Perl - slidepdf.com

http://slidepdf.com/reader/full/webservices-in-perl 7/7

   I   t  a   l   i  a  n 

   F  r  e  e

Un progetto che mi ha colpito particolar-mente è Php-Residence, un sistema perla gestione di hotel direttamente via WEB- realizzato da Marco De Santis. Come sipuò facilmente intuire, Php-Residence èstato sviluppato in PHP e rilasciato sottolicenza GPL. I sorgenti possono essereprelevati liberamente dal sito ufficiale; èpossibile visionare una demo per farsiun’idea della bontà del prodotto diretta-

mente dal sito. Per provare l’applicazioneanche sul proprio PC si deve configurareun ambiente di test; quindi sono neces-sarie le installazioni di un WEB SERVER eun DBMS come “contenitore” dati (comeMySql). Php-Residence può essere utiliz-zato sia sotto Windows (in questo casosarà necessario installare un “PHPEngine” come ad esempio Easyphp) cheLinux. L’autore ha avuto il grande meritodi essersi preoccupato anche della loca-lizzazione in modo da poter rivolgersi aduna maggiore utenza possibile; si posso-no scegliere tra ben quattro lingue: italia-no, inglese, spagnolo, tedesco. Durante ilprimo utilizzo si devono impostare alcuniparametri (come il collegamento al DB,

l’indirizzo dove risiede il WEB SERVERecc.) dopodiché si passano ad impostarele componenti tipiche di un hotel come letariffe o le regole per la gestione delleprenotazioni. Il sistema su cui si poggiaPhp-Residence permette di verificare

sulle varie postazioni, in tempo reale, sead esempio le camere sono disponibilioppure indirizzare i clienti verso altri hoteldella stessa catena. Le varie pagine dis-pongono di un buon numero di funzionali-tà soprattutto legate alle prenotazioni; èstato realizzato un completo sistema diregolazione per l’assegnazione automati-ca delle camere in base al numero dicomponenti per prenotazione (sul sito

ufficiale è presente una pagina cheapprofondisce il concetto). E’ possibileanche inserire e modificare in qualsiasimomento i dati dei clienti (come la tarif fae la camera associate); la formattazionedei dati contenuti nelle tabelle rende piùcomoda la consultazione permettendo diavere dei riepiloghi annuali. Si possonomemorizzare inoltre dei promemoria, veri-ficare i costi di gestione per quanto riguar-da le entrate/uscite della propria attivitàcon tanto di storico e bilancio. Abbiamoavuto modo di contattare Marco che hatenuto a dire: “Php-residence è stato ilmio primo progetto in assoluto, iniziai alavorarci nel 2000.Avendo l’esigenza di gestire alcune case

vacanza assieme a dei familiari sparsi invarie località, qualcosa di accessibile viaweb era l’ideale e così colsi l’occasione diun tutorial sul php pubblicato da una rivi-sta. Le sue funzionalità sono dunquerivolte più alla gestione che alle prenota-

zioni online, anche se ora è possibile con-trollare la disponibilità via internet. Lacaratteristica principale che lo contraddi-stingue, anche rispetto a prodotti com-merciali, è l’assegnazione automaticadegli appartamenti alle prenotazioni”. Almomento della scrittura dell’articolo Php-Residence è penalizzato dallo stile graficoutilizzato, che se pur semplice, non rendegiustizia ad un buon prodotto (secondo il

mio modesto parere). In particolare i pul-santi presenti nelle varie schermate sonosistemati in maniera a dir poco confusio-naria rendendo difficoltoso l’utilizzo adutenti meno esperti. Marco, tra l’altrosempre molto disponibile, non ha esitatoa comunicarci che sta prendendo in con-siderazione una profonda modifica dell’in-terfaccia per far ottenere a Php-Residence la giusta consacrazione. Perulteriori informazioni rimando al link delsito ufficiale.

http://www.digitaldruid.net/php-residence/

Ricordiamo che per le proposte si puòfare riferimento all’indirizzo dell’autore,includendo una descrizione del progetto eil relativo URL dove poter effettuare ildownload. Le segnalazioni ritenute di inte-resse saranno prese in considerazionedalla redazione.

PHP-RESIDENCEQuesto mese andiamo ad esaminare un sistema web per la gestione alberghiera 

a cura di Gianluca Masina > [email protected]

Inoltre è possibile associare agli eventi delle funzioni invo-

cate 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”;

}

Otteniamo il log che riporta il numero d’ordine di ognirichiesta del web service.

Bibliografia e riferimenti[1] Randy j.Ray,Pavel Kulchenko, “Programming Web

Services with Perl”, O’Reilly 2001

[2] James Snell, Doug Tidwell & Pavel Kulchenko, “Pro-

gramming Web Services with SOAP”, O’Reilly 2001

[3] http://www.soaplite.com, il sito ufficiale si SOAP::Lite.

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

 WebServices in Perl

58 DEV > n. 127 marzo 2005>>

programmazione Perl

Evento Client o Server? Significato

transport Client L’uso degli oggetti HTTP::Request e HTTP::Response durante

il trasporto dei messaggi SOAPdispatch Server Mostra il nome completo della chiamata del WS : modulo/metodoresult Server Da il risultato della chiamata al metodo

parameters Server Mostra i parametri della chiamata al metodo

headers Server Restituisce gli header del messaggio ricevuto

objects Client e Server Istanziazione e distruzione degli oggettifault Client e Server Eccezione nell’esecuzione

TABELLA 1

Fausto Zanasi