LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione...

162
LAVORARE CON INTERNET MASHUP: OVVERO COME INTEGRARE I SERVIZI OFFERTI DA GOOGLE, MICROSOFT, TECHNORATI, FLICKR E GLI ALTRI ALL’INTERNO DELLE PROPRIE APPLICAZIONI Filippo Costalli & Ivan Venuti

Transcript of LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione...

Page 1: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

© 2007 Edizioni MasterTutti i diritti riservati

LAVORARE CON INTERNET

Internet nel corso del tempo ha modificato lasua fisionomia. Siamo passati da una strutturain cui i collegamenti fra i diversi contenuti

presenti in rete erano realizzati con Link, ad unainfrastruttura in cui tutto è interconnesso tramiteAPI. Ad esempio è possibile localizzare laposizione di un sito tramite il suo indirizzo IP emostrarne la locazione geografica su GoogleMaps. Oppure è possibile utilizzare Flickr comedeposito per le immagini da visualizzare sulproprio Blog sfruttandone tutta la potenza deitag. E ancora gli RSS consentono di integrare fradi loro contenuti diversi riaggregandoli inmolteplici forme. Anche la programmazionetradizionale trae beneficio da queste innovazioni.È oggi possibile creare applicazioni che sfruttinopesantemente le migliaia di API esposte suInternet. In questo libro, ricco di esempi, vengonopresentate alcune delle API più famose e vieneillustrato un percorso che mette in grado ilprogrammatore di cominciare a pensare in mododistribuito. Un Hand Book essenziale per essereuno sviluppatore dei nostri giorni

• I linguaggi e la loro interazione con i Web Services• Gli esempi con Google, Flickr, Technorati...• Accesso diretto alle risorse Web

LAVORARE CONINTERNETLA

VO

RA

RE

CO

NIN

TER

NET

MASHUP: OVVERO COME INTEGRARE I SERVIZI OFFERTI DA GOOGLE, MICROSOFT,TECHNORATI, FLICKR E GLI ALTRI ALL’INTERNO DELLE PROPRIE APPLICAZIONI

Filippo Costalli & Ivan Venuti

Copertina:IV-I copertina 4-09-2007 12:25 Pagina 1

Page 2: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Frontespizio 31-08-2005 17:26 Pagina 2

Page 3: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

LAVORARE CONINTERNET

di Filippo Costalli & Ivan Venuti

Frontespizio:Frontespizio 31-08-2007 16:54 Pagina 1

Page 4: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Frontespizio 31-08-2005 17:26 Pagina 2

Page 5: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 3

IndiceLAVORARE CONINTERNET

INDICE

Cap. 1 Introduzione . . . . . . . . . . . . . . . . . .7

Cap. 2 l’ambiente di sviluppo . . . . . . . . .17

Cap. 3 Api di Google . . . . . . . . . . . . . . . .35

Cap. 4 Il primo Mashup . . . . . . . . . . . . . .43

Cap. 5 Mappe con il meteo e geocoding .61

Cap. 6 Accesso diretto a risorse Web . . . .93

Cap. 7 Altri Mashup in PHP . . . . . . . . . .111

Cap. 8 Altri Mashup in Java . . . . . . . . . .145

Ind:003-006 31-08-2007 17:38 Pagina 3

Page 6: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Indice

I libri di ioPROGRAMMO/Lavorare con Internet4

LAVORARE CONINTERNET

PREFAZIONE

Questo libro presenta esempi e soluzioni che, grazie all’uso di diver-se sorgenti di dati (ma tutte legate al Web), forniscono soluzioni nuo-ve, integrate, personalizzate… in una parola: mashup (infatti è que-sto il termine, derivato dall’inglese, con cui si denota questo tipo disoluzioni).Per farlo verranno analizzate diverse tecnologie, la cui scelta è detta-ta da più fattori. Hanno avuto una notevole rilevanza nella loro scel-ta anche la presenza di primitive e/o librerie per sfruttare meccanismidi comunicazione quali REST, Atom, RSS e la loro diffusione tra gli svi-luppatori. Tutte queste considerazioni hanno portato a scegliere Javae PHP per lo sviluppo di esempi lato server. Questi linguaggi non ver-ranno presentati, perché viene data per acquisita la loro conoscenza. Per quanto concerne la programmazione lato client è consideratoun prerequisito l’uso di JavaScript. Ovviamente AJAX la fa da padro-ne per quanto concerne la comunicazione tra client e server. Anche inquesto Google ha precorso i tempi fornendo una serie di librerie dal-l’eccezionale qualità, potenza e semplicità d’uso. Anche molti altri ser-vizi, per la maggior parte gratuiti, vengono analizzati e usati negliesempi proposti. Chiaramente per ognuno non c’è spazio per ap-profondimenti e discussioni particolareggiate, ma per tutti sono forniterisorse e link che, insieme agli esempi, permettono di comprendere lefunzionalità che si pensa possano aiutare a realizzare le proprie applicazioni.Non resta che augurarvi una buona lettura con la speranza che il libro,oltre ad avervi aiutato a comprendere gli esempi presentati, possaaiutarvi a proporre vostri esempi originali ed applicazioni ancor piùinteressanti e innovative.

Filippo Costalli, Ivan [email protected] ,[email protected]

Ind:003-006 31-08-2007 17:38 Pagina 4

Page 7: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 5

IndiceLAVORARE CONINTERNET

Gli autori: Filippo Costalli è laureato in Scienze dell'Informazione e lavora comeanalista programmatore. Appassionato di informatica da sempre, at-tualmente focalizza la sua attività sulla programmazione Object Orien-ted. È contattabile all'indirizzo [email protected]. Ha scritto i Capi-toli 2, 3, 5, 7.

Ivan Venuti è laureato in Informatica e lavora come analista pro-grammatore. La passione per la programmazione lo ha sempre portatoad approfondire nuove tecnologie, tecniche di sviluppo e frameworkemergenti. Scrive abitualmente articoli per alcune tra le maggiori rivistedi informatica italiane e ha al suo attivo numerosi libri sulla pro-grammazione, in particolare su Java. Sul suo sito personale, raggiun-gibile all’indirizzo http://ivenuti.altervista.org, sono messe a disposi-zione notizie e informazioni aggiornate sulla sua attività professio-nale. Ha scritto i Capitoli 1, 4, 6, 8.

Ind:003-006 31-08-2007 17:38 Pagina 5

Page 8: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Ind:003-006 31-08-2007 17:38 Pagina 6

Page 9: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 7

IntroduzioneCapitolo 1LAVORARE CONINTERNET

INTRODUZIONE

La prima ovvia domanda che ci si potrebbe porre è: “che si intende permashup”? In questo caso ci facciamo aiutare da Wikipedia per una de-finizione un po’ formale: “mash-up è letteralmente una poltiglia, in ter-mini informatici è un'applicazione che usa contenuto da più sorgentiper creare un servizio completamente nuovo. Il contenuto dei mashupè normalmente preso da terzi via API, tramite feed (eg. RSS e Atom) oJavascript”. Scomposta la frase, si analizzeranno alcuni termini che pos-sono chiarire ancora meglio questa definizione e, in particolare:

� Applicazione� Più sorgenti (di contenuto)� API, Feed (RSS, Atom) o JavaScript

APPLICAZIONEUn’applicazione implica la realizzazione di una soluzione completa, do-tata sì di dati, ma anche (e soprattutto!) di funzionalità utili a raggiun-gere un determinato obiettivo. In questo contesto si dà per scontatoche le applicazioni debbano essere usufruite via Web, quindi attraver-so un opportuno browser. Web 2.0 è, aldilà di molte chiacchiere, unparticolare modo di realizzare queste applicazioni. Da un lato c’è l’at-tenzione a realizzare applicazioni che rispondono in maniera simile al-le usuali applicazioni desktop (quindi senza le interazioni submit/load ti-piche delle pagine HTML del passato) ma dall’altro c’è una particolareattenzione all’utente e a renderlo partecipe delle informazioni reperite(o permettendo di aggiornarle o, perlomeno, di personalizzarne la vi-sualizzazione).

PIÙ SORGENTIIl concetto di sorgente dati è molto vago ma, per tutte, può essere con-

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 7

Page 10: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 1

I libri di ioPROGRAMMO/Lavorare con Internet8

IntroduzioneLAVORARE CON

INTERNET

siderata un’origine remota, slegata dall’appliazione e da essa non con-trollata. In pratica chi realizza la sorgente dei dati non è (quasi mai)la stessa persona che realizza l’applicazione che ne estrae dati per ese-guire il mashup. Per questo motivo è fondamentale definire e analiz-zare la modalità di estrazione e fruizione. Tra esse possono esserci:∑� Accesso diretto alla pagina pubblicata (parsing HTML);� Accesso attraverso feed (RSS o Atom)� Accesso usando API (REST, SOAP, XML-RPC…) sul server� Accesso usando API sul client (JavaScript)

Di seguito l’analisi delle diverse modalità.

Parsing HTMLLa più semplice fonte di contenuto può essere una qualsiasi paginaWeb. In questo caso è necessario far sì che la pagina venga analiz-zata alla ricerca delle informazioni cercate (probabilmente è neces-saria un’operazione di parsing e di reperimento “mirato”, ovverospecifico per la struttura della particolare pagina). È indubbio chequesto è fonte di possibili problemi: nulla vieta che l’autore dellapagina cambi completamente disposizione del contenuto, cambi l’or-dine di visualizzazione o quant’altro. Ciò è perfettamente lecito inquanto una pagina Web è “pensata” per essere usufruita da unapersona e non da un programma automatico. Ecco che chi ha inte-resse a condividere le informazioni, affinché vengano usate su sitidi terze parti, ha la necessità di definire delle interfacce, che fungo-no da contratto per chi fornisce l’informazione e per chi la usa. Taliinterfacce devono essere il più possibile standard e invarianti neltempo, oltre che ad essere orientate ai dati (quindi al contenuto) enon alla loro presentazione (infatti, il fatto che un titolo sia in gras-setto e di colore blu, il testo nero e font Verdana, è una scelta di pre-sentazione; il fatto di identificare dei titoli e del testo, è una scelta dicontenuto). Nel tempo sono state definite diverse forme di inter-

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 8

Page 11: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 9

IntroduzioneCapitolo 1LAVORARE CONINTERNET

scambio, in particolare…

Feed RSS e AtomQuasi tutte le tecnologie di interscambio dati sono basate su docu-menti XML. È il caso di feed RSS e Atom. RSS vede la nascita, comeidea, nel 1995. Da allora si è evoluto fino a divenire uno standard difatto per la distribuzione di aggiornamento, sia per contenuti pub-blicati da portali che per blog o altri siti Web. Chi pubblica i dati met-te a disposizione, in un documento XML standard, gli aggiornamen-ti delle informazioni in maniera da poter estrarre in modo incremen-tale le informazioni di interesse (grazie ad attributi come la data dipubblicazione o di aggiornamento). Per leggere gli RSS ci vuole unapposito software, chiamato lettore RSS o aggregatore RSS. Atom èun’evoluzione di RSS, nel senso che nasce come proposta di standard(si veda http://tools.ietf.org/html/rfc4287) e vuol risolvere il proble-ma delle versioni RSS che nel tempo sono nate ed evolute (spesso inmaniera poco controllata), ma mantiene inalterata l’idea di fondodi formato di interscambio di dati per la notifica degli aggiornamen-ti dei contenuti.Feed RSS e Atom sono di enorme interesse sia per la quantità di si-ti Web che offrono questo tipo di informazione, sia perché Google usaquesto formato (Google's Data API, in breve GData) per poter acce-dere agli aggiornamenti contenuti nei suoi servizi, quali Blogger,Google News, and Gmail e molti altri servizi che continua a sforna-re in quantità (e qualità!) impressionante. GData, oltre ad essere unprotocollo comune a tutti i servizi, è semplice da usare, in quantoGoogle mette a disposizione una libreria già pronta per i principalilinguaggi di programmazione.

API da server (REST, SOAP, XML-RPC…)Nel caso in cui le informazioni siano piuttosto complesse (dati ete-rogenei e a più dimensioni) e numerose (tanti dati) può essere con-veniente definire delle modalità di estrazione più mirate rispetto a quan-

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 9

Page 12: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 1

I libri di ioPROGRAMMO/Lavorare con Internet10

IntroduzioneLAVORARE CON

INTERNET

to sia possibile fare con i feed RSS (sia in termini di dati reperiti chein termini di interrogazioni tra le diverse dimensioni dei dati, quali ladata, la presenza di sottostringhe in certi campi e così via). In que-sti casi si ricorre a tecnologie che vanno sotto il nome di Web Servi-ces. Anche in questo caso l’XML è la base per l’interscambio dei da-ti ma, nello specifico, è possibile definire anche operazioni esposteda un server e fruibili da uno o più client. Di solito si parla di appli-cazioni “business to business” per indicare che i fruitori dei WebServices (client) sono altre applicazioni e non utenti (come accade perun’interazione client/server classica com’è quella tra un browser e unserver di pagine Web). In pratica i Web Service sono implementati daun’applicazione che risiede su un server che, per poter svolgere le sueattività, demanda alcune funzionalità (o reperisce ulteriori dati) adaltri server. Spesso si fa uso di frame work che semplificano la scrit-tura di Web Services (sia client che server). L’adozione di uno speci-fico frame work dipende sia dal linguaggio adottato che dalle carat-teristiche volute. Nel seguito si farà uso di alcuni di questi framework sia per Java che per PHP.

API da client (JavaScript)Ultimamente emergono sempre più servizi che offrono le propriefunzionalità usando JavaScript, ovvero librerie che possono essere in-cluse dinamicamente dai browser che mostreranno le informazioni.Questa soluzione porta a estrarre i dati direttamente sul client. Sivedrà che questo può portare sia a vantaggi che svantaggi rispettoa soluzioni che fanno uso di Web Services lato server. Nel corso dellibro verranno mostrati vari esempi che permettono di capire me-glio questi aspetti.

SI DEVE PROGRAMMARE? NON È DETTO!Una volta definito cosa si intende con mashup e chiarite quali pos-

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 10

Page 13: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 11

IntroduzioneCapitolo 1LAVORARE CONINTERNET

sono essere le diverse tecnologie coinvolte, si può vedere, concreta-mente, come realizzare un semplice mashup. Per farlo non sono ne-cessarie conoscenze di programmazione! Infatti, ultimamente, sononati molti servizi (alcuni anche gratuiti!) per creare mashup usandosemplici interfacce grafiche. In Tabella 1.1 alcuni dei principali sitiche offrono questi servizi.

Per comprendere il tipo di risultati che si può ottenere si userà il servi-zio Dapper. Esso permette di estrarre dei contenuti da una o più pagi-ne Web e di metterle a disposizione in vari formati (feed RSS, Google Ma-ps, iCalendar e così via). Per prima cosa è opportuno identificare le pa-gine Web da cui estrarre i dati di interesse; successivamente bisognacapire come visualizzare i dati (pensando quali tra quelli a disposizio-ne sono utili allo scopo) e si può iniziare con la creazione della “DappFactory” (è così che viene chiamata l’applicazione che si costruisce).

Tabella 1.1: Alcuni tra i più noti servizi che offrono la possibilità dicreare mashup usando interfacce semplici e intuitive, senzaricorrere alla programmazione.

Sito Web Descrizione

http://code.google.com/gme/

http://www.dapper.net

http://www.bea.com/framework.jsp?CNT=index.jsp&FP=/content/products/aqualogic/ensemble/http://www.popfly.com

Google Mashup Editor: un servizio (ancorain fase beta) per la creazione di mashupPermette di creare, e condividere, mashup apartire da siti Web esistenti. I dati possonoessere esportati in vari formati (feed RSS,Google Maps, iCalendar e altro ancora).BEA Aqualogin Ensemle: fare mashupusando tool di classe enterprise

Tool per mashup creato da Microsoft e chefa uso della nuova tecnologia silverlight

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 11

Page 14: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 1

I libri di ioPROGRAMMO/Lavorare con Internet12

IntroduzioneLAVORARE CON

INTERNET

Un esempio con DapperLa pagina http://www.inea.it/ssa/copindirizzi.html ha dei link a di-verse pagine, tra cui una lista di università con la Facoltà di Agrariae quelle di Economia e commercio. La costruzione del nostro DappFactory consiste nello specificare la pagina di partenza e di sceglie-re il tipo di risultato; per esempio si potrà scegliere Google Maps,volendo mostrare una mappa con la georeferenziazione delle univer-sità reperite (Figura 1.1a).Il passo successivo consiste nella preview della pagina (Figura 1.1b);da tale preview si può navigare tra i link e, usando il pulsante “Addto basket”, si possono scegliere le pagine di interesse (Figura 1.1c).Il passo successivo permette di selezionare il contenuto da estrarre(Figura 1.1d).

L’estrazione del contenuto, nel caso di tabelle, è piuttosto semplice:basta esitare la tabella con l’apposito pulsante (“Table”) e fare clicsulla lettera della colonna (che, come in un foglio Excel, è “A”, “B”

Figura 1.1: Dapper e la creazione di un Dapp Factory.

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 12

Page 15: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 13

IntroduzioneCapitolo 1LAVORARE CONINTERNET

e così via). Il primo dato che si vuol estrarre è il nome dell’università(colonna A). Una volta selezionata la colonna si avrà sulla finestra “Pre-view selected content” la lista delle università della pagina. Per ren-dere persistente la selezione premere sul pulsante “Save fields” dan-dogli un nome significativo (per esempio “Ente”). Per l’indirizzo è ne-cessario selezionare più colonne, in particolare le colonne B (indi-rizzo), C (Cap) e D (Città). Per la selzione multipla basterà tenerepremuto il tasto Ctrl. Anche per queste informazioni ci sono la pre-view e la possibilità di assegnarle ad un campo (in questo caso lo sipuò chiamare “indirizzo”), come mostrato in Figura 1.2.

I due campi (ente ed indirizzo) in realtà si riferiscono alla stessa infor-mazione; per questo nella pagina successiva li si può selezionare eraggruppare. Il passo seguente permette di salvare le informazioni(per farlo è necessario fornire un indirizzo di email valido e proteg-gere l’account con una password). Poi si può scegliere il nome del-l’applicazione da salvare, associargli una descrizione e decidere se

Figura 1.2: Estrazione degli indirizzi.

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 13

Page 16: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 1

I libri di ioPROGRAMMO/Lavorare con Internet14

IntroduzioneLAVORARE CON

INTERNET

lasciarla pubblica o renderla privata (Figura 1.3) C’è anche la possi-bilità di segnalare che quella creata è un’applicazione di test: in que-sto caso dopo 24 ore essa verrà eliminata dal sistema.

Terminata la creazione, la nuova applicazione è sempre accessibilesia dal proprio profilo (da cui la si può modificare) o come link diret-to. In ogni caso la mappa presenta tanti marcatori quanti sono leuniversità reperite; ciascuno è posizionato in corrispondenza del-l’indirizzo indicato e, facendoci clic, appare un fumetto con la de-scrizione reperita dalla pagina Web di origine (Figura 1.4).

Figura 1.3: Caratteristiche di pubblicazione.

Figura 1.4: La mappa generata usando gli indirizzi reperiti sul Web.

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 14

Page 17: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 15

IntroduzioneCapitolo 1LAVORARE CONINTERNET

NON BASTA?Benché i servizi di mashup per non programmatori stiano divenen-do sempre più complessi e completi, il loro utilizzo non giustificacerto la scrittura di un intero libro. D’ora in avanti si farà uso di pro-grammi, sia client che server, mostrando i passi per creare applica-zioni che realizzano mashup. Il vantaggio di ricorrere a questo tipodi soluzioni è la flessibilità: si mostreranno casi in cui si possono usa-re alcune tecnologie, altre volte le si integrerà con altre e più sofisti-cate librerie ma, in tutti i casi, le soluzioni possono essere modifica-te e adattate alle proprie esigenze. In Rete, come sempre, esistononumerosi servizi che forniscono API. Un buon punto di inizio può es-sere ProgrammableWeb (, Figura 1.5). Però, prima di programmare,è necessario aver configurato opportunamente il sistema e installa-to gli strumenti necessari…

Figura 1.5: Il sito ProgrammableWeb, dove sono censiti centinaia di API e

mashup esistenti.

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 15

Page 18: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 1 (007-016):007-050 31-08-2007 16:56 Pagina 16

Page 19: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 17

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

L’AMBIENTE DI SVILUPPO

In questo capitolo verranno intodotte le tecnologie utilizzate nel pro-sieguo del libro. Particolare attenzione sarà posta nell’illustrare co-me creare un proprio ambiente di sviluppo per utilizzare, estenderee migliorare le applicazioni che, in seguito, verranno presentate edescritte.

JAVA E LE APPLICAZIONI WEBSul proprio computer è necessario far sì che venga installato un am-biente adatto all’installazione di applicazioni Web realizzate con Java (ap-plicazioni che in gergo sono chiamate “webapp”, contrazione di “web-application”). Per farlo si consiglia di scaricare il JDK della Sun (che of-fre gli strumenti per compilare ed eseguire le classi Java) e Apache Tom-cat (che è il server di riferimento per le applicazioni Web Java). Di segui-to le istruzioni minime per la loro installazione. Si rimanda ai siti ufficia-li per eventuali approfondimenti sul loro uso e la loro configurazioneavanzata.

Installare il JDKCollegandosi alla pagina http://java.sun.com/j2se/index.jsp è possibileseguire il link verso il Java Development Kit (abbreviato in JDK). È pos-sibile scaricare diverse versioni; per gli esempi di questo libro è neces-sario usare una versione 5.0.12 (la versione di “Update”, ovvero l’ulti-

AttenzionePer poter eseguire gli esempi è necessario avere installato (e funzio-nante) un Apache Tomcat 5 e un Web Server che interpreti PHP 5. Sesi hanno già disposizione questi strumenti potete saltare questo capi-tolo e installare da subito le applicazioni. Inoltre, alla pagina http://ivenuti.al-tervista.org/risorse/mashup.htm, sono presentati tutti i link del libro,al fine di facilitarne l’uso senza doverli riscrivere uno ad uno.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 17

Page 20: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet18

L’ambiente di sviluppoLAVORARE CON

INTERNET

mo numero, è opzionale; si consiglia di scaricare sempre l’ultima, che almomento di andare in stampa è, appunto, la 12). Il JDK è disponibile co-me installer specifico per i sistemi operativi (Windows e Linux).Settare le variabili d’ambienteUna volta installato il JDK è opportuno settare opportunamente alcunevariabili d’ambiente; benché questa operazione non sia sempre fonda-mentale, è vivamente consigliata, sia perché in questo modo è più co-modo utilizzare gli strumenti del JDK, sia perché molte applicazioni, chesi basano su Java, fanno uso di alcune di queste informazioni (è il casodi Apache Tomcat). Per conoscere le variabili d'ambiente già presentibasta aprire una console di comandi e, in Windows, digitare:

set

in Linux, invece, si digiterà il comando:

env

In entrambi i casi vengono stampate a video tutte le variabili d'ambien-te già definite (in Figura 2.1 un esempio).

Figura 2.1: risultato del comando set su un sistema Windows.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 18

Page 21: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 19

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

Per agevolare lo sviluppo di programmi Java si definiscano le variabili d'am-biente JAVA_HOME e CLASS_PATH in maniera che la prima indichi lacartella di installazione del JDK, la seconda dove trovare le classi (inizial-mente i due valori coincideranno). È bene provvedere anche a modifi-care la variabile PATH affinché vengano aggiunti gli eseguibili del JDK.In Tabella 2.1 le variabili da definire per i sistemi Windows e in Tabella2.2 quelle per Linux, con la descrizione del loro significato e i valori con-sigliati.

Le variabili sono definibili direttamente da una console di comandi macosì facendo hanno un valore locale ad essa (in pratica vengono persequando si chiude la console corrente e, similmente, aprendo nuove con-sole le variabili definite nella prima non sono propagate alle altre). Ov-viamente è comodo, a parte casi particolari, definirle una volta per tut-te.In Windows Xp le variabili d’ambiente si definiscono, in maniera perma-nente, ovvero che persiste anche nelle successive sessioni, facendo clic

Variabile Valore (consigliato) Significato

JAVA_HOME

CLASSPATH

PATH

set JAVA_HOME=c:\cartella\path\

set CLASSPATH=.;%JAVA_HOME%

set PATH=%PATH%;%CLASSPATH%\bin

Cartella di installazione delJDK

Sia la cartella diinstallazione del JDK chequella corrente (indicatacon il carattere “punto”: “.”e che è consigliabilemettere per prima)

Mantenere il PATH definitodi default dal sistema eaggiungervi anche quellodella cartella /bin del JDK

Tabella 2.1: Variabili d’ambiente da settare (Windows); si notil'uso del carattere “;” per separare una lista di valori e di%nome% per riferirsi ad una variabile definita in precedenza.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 19

Page 22: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet20

L’ambiente di sviluppoLAVORARE CON

INTERNET

con il pulsante destro su “Risorse del sistema”, scegliendo “Proprietà”dal menu contestuale. Dalla finestra si selezioni il tab “Avanzate” equindi il pulsante “Variabili d’ambiente”.In Linux invece è necessario editare il file di configurazione della shellin uso. Se essa, com'è di solito, è la bash, bisognerà editare il file .ba-sh-profile presente nella cartella home dell’utente con cui ci si collega(tale cartella è quella a cui si accede eseguendo il comando “cd” sen-za parametri).

Si faccia attenzione anche al fatto che in Linux tutti i comandi e i nomidi variabili di sistema sono “case sensitive”: è importante rispettare le

Variabile Valore (consigliato) Significato

JAVA_HOME

CLASSPATH

PATH

set JAVA_HOME=c:\cartella\path\

set CLASSPATH=.;%JAVA_HOME%

set PATH=%PATH%;%CLASSPATH%\bin

Cartella di installazione delJDK

Sia la cartella diinstallazione del JDK chequella corrente (indicatacon il carattere “punto”:“.”).

Mantenere il PATH definitodi default dal sistema eaggiungervi anche quellodella cartella /bin del JDK

Tabella 2.2: Variabili d’ambiente da settare (Linux); si noti l'usodel carattere “:” per separare una lista di valori e di $nome perriferirsi ad una variabile definita in precedenza.

AttenzioneSe si vuol visualizzare il valore di una variabile d'ambiente è neces-sario aprire una console di comandi e digitare il comando echo %no-mevariabile% in Windows, mentre il comando echo $nomevaria-bile è utilizzabile sui sistemi Linux.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 20

Page 23: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 21

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

maiuscole/minuscole dei nomi; in Windows, invece, maiuscolo o minu-scolo è lo stesso (in questo caso si dice che le variabili, e i loro valori, so-no “case insentitive”).

Test dell’ambienteUna volta definite le variabili sopraccitate, si apra una console dei co-mandi e si provi a digitare:

java –version

se tutto è andato a buon fine dovrebbe apparire la versione dell’inter-prete Java (versione che coincide con quella del JDK installato, Figura 2.2).

Installare TomcatLa pagina di riferimento del progetto è http://jakarta.apache.org. Co-me si può notare esistono diverse versioni di Tomcat; ciascuna implemen-ta una specifica versione delle specifiche Servlet e JSP. Per eseguire gliesempi del libro è possibile usare sia la versione 6 (anche se, al mo-mento di andare in stampa, è ancora considerata un release non stabi-le), sia la versione 5.5.Tutti i pacchetti iniziano con jakarta-tomcat-[versione], dove [versione]è il numero di versione. Poi ci possono essere un ulteriore suffisso e una

Figura 2.2: Verifica che il JDK sia configurato correttamente.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 21

Page 24: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet22

L’ambiente di sviluppoLAVORARE CON

INTERNET

diversa estensione, in particolare:

.zip: distribuzione di base (in formato compresso);

.exe: contiene il pacchetto e l’installer per Windows;

Tutte le versioni (ovviamente a meno della .exe) sono anche in forma-to .tar.gz per essere utilizzate con il comando tar (compatibile con laversione GNU).

Installazione di TomcatDurante l’installazione (completamente guidata nel caso si scelga l’in-staller di Windows) è necessario prestare attenzione alle scelte:

1. quali componenti includere2. il path del JRE3. porta ove risponde il server e credenziali di amministratore

Per i componenti si consiglia la versione “Full”, comprensiva di tutti i com-ponenti. Il path del JRE deve contenere il percorso per accedere al JRE(precedentemente installato e deve avere una versione 5.0 o successi-va), mentre la port è, di default, la 8080, anche se se ne può scegliereuna diversa; tale scelta modificherà la url di connessione alle applica-zioni installate. Inoltre si possono impostare le credenziali dell’ammini-stratore (esso è l’utente che può gestire in toto la configurazione e la ma-nutenzione del server).

Verificare che tutto funzioniLa verifica dell’avvenuta installazione è molto semplice: basta collegar-si all’url del sistema locale (127.0.0.1 o utilizzando l’alias “localhost”)e specificare la porta impostata nella fase di installazione (di default la8080); se tutto funziona correttamente apparirà una pagina predefini-ta come quella mostrata in Figura 2.3 (i dettagli possono differire per ver-sioni di Tomcat diverse).

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 22

Page 25: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 23

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

Le cartelle di TomcatIn Figura 2.4 le diverse cartelle contenute nella root dell’installazione (d’o-ra in poi si farà riferimento alla root con il nome $CATALINA_HOME: èla stessa convenzione utilizzata in tutta la documentazione ufficiale acorredo di Tomcat).

Figura 2.3: la pagina di benvenuto dopo aver installato Tomcat

correttamente.

Figura 2.4: le cartelle (a partire dalla root dell’installazione di Tomcat).

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 23

Page 26: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet24

L’ambiente di sviluppoLAVORARE CON

INTERNET

Le più importanti sono webapps/, che conterrà tutte le applicazioni,logs/ che conterrà i log (stampe) sia di Tomcat che delle applicazioni ebin/, che contiene gli script per l’esecuzione e lo stop del Tomcat.

JAVA E I WEB SERVICESI Web Services sono particolarmente semplici da usare in quanto chicrea il servizio espone un documento, chiamato WSDL, che descrive tut-ti i dettagli del servizio. Grazie ad esso è possibile creare l’infrastruttu-ra di comunicazione in maniera automatizzata. Per farlo si deve però uti-lizzare un frame work apposito o delle primitive del linguaggio usato. Java è particolarmente ricco di strumenti di sviluppo per realizzare WebServices. Basti pensare che l’ultima release del linguaggiom, la 6.0, of-fre supporto nativo alla loro realizzazione. Per quanto concerne tool diterze parti non c’è che l’imbarazzo della scelta. Tra i frame work “stori-ci” più utilizzati si segnala senz’altro Axis (http://ws.apache.org/axis/) manon mancano altre proposte, sia Open Source che commerciali. In Tabel-la una sintesi dei principali frame work.

AttenzioneUna volta installato il Tomcat si possono provare gli esempi del li-bro copiando il file con estensione .war direttamente nella cartellawebapps/.

Sito Web Framework

http://java.sun.com/javase/6/

http://ws.apache.org/axis/

http://ws.apache.org/axis2/

La distribuzione 6.0 ha il supporto dei WebServices inclusa direttamente nel JDK

Axis: uno dei più diffusi framework OpenSource per Java (esiste un porting anche perC++)

Axis 2: la versione successive di Axis, che è una completa riscrittura e re-ingegnerizzazione

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 24

Page 27: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 25

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

L’applicazione Java allegataIl libro descriverà varie applicazioni realizzate in Java (e, come si vedràsuccessivamente, anche PHP). Per l’installazione delle applicazioni Ja-va è sufficiente copiare il file LibroMashup.war sotto la cartella webap-ps/ di Tomcat. Accedendo all’indirizzo http://server:porta/LibroMashupapparirà la pagina iniziale (Figura 2.5) contenente i link a tutte le appli-cazioni.

AttenzioneI Web Services sono un argomento particolarmente sensibile alleevoluzioni, sia tecnologiche che per quanto concerne gli standard diriferimento. Non da meno è importante usare sempre le nuove ver-sione dei diversi framework. Java 6, per esempio, ha rilasciato un ag-giornamento poco dopo il rilascio della versione ufficiale (https://jax-ws.dev.java.net/). XFire sta evolvendo in un progetto Apache e at-tualmente è in fase “incubator”, ovvero in attesa di entrare a farparte dei progetti ufficiali. Il nome del nuovo progetto sarà ApacheCXF (sito di riferimento http://incubator.apache.org/cxf/)

Sito Web Framework

http://xfire.codehaus.org/

http://www.systinet.com/products/ssj/overviewhttp://xins.sourceforge.net/

http://labs.jboss.com/jbossws/

http://www.restlet.org

Tabella 2.3: alcuni framework per sviluppare Web Services in Java.

XFire: un frame work particolarmenteperformante che sta riscuotendo notevolesuccesso (anch’esso Open Source)Systinet Server for Java; un server commercialeper WS in JavaXINS (XML Interface for Network Services);progetto Open Source che supporta SOAP, XML-RPC e RESTJBossWS: un sottoprogetto di JBoss specifico per I Web ServicesUn framework per applicazioni che usano REST(sia client che server)

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 25

Page 28: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet26

L’ambiente di sviluppoLAVORARE CON

INTERNET

Prima di poterle usare è necessario ottenere varie chiavi di accesso (unaper ogni servizio). Tali chiavi sono configurabili seguendo il link “Chia-vi” (Figura 2.6).

Figura 2.5: la pagina principale del progetto Java con gli esempi del libro.

Figura 2.6: la pagina dove inserire le chiavi dei diversi servizi.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 26

Page 29: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 27

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

EASYPHPPer l’utilizzo del linguaggio PHP adotteremo il prodotto EasyPHP, con-tenente tutto il necessario per un utente che desideri iniziare immedia-tamente a sviluppare con PHP. EasyPHP è un pacchetto software checonsente l’installazione del server HTTP Apache, del database MySQL edil completo supporto del linguaggio di scripting PHP. Il tutto integratoin un unico prodotto. Vediamo come procurarsi questo prodotto, comeinstallarlo sulla nostra macchina e come utilizzarlo.

InstallazionePer prima cosa occorre scaricare il pacchetto, collegandosi all’indirizzohttp://www.easyphp.org/telechargements.php3 La procedura di instal-lazione risulta essere notevolmente semplice ed intuitiva. È sufficiente,infatti, cliccare sull'icona del programma e premere “avanti” ogni qualvolta questo venga chiesto. Una volta terminata questa semplice ope-razione, verificare la corretta installazione nel seguente modo.Avviare il pacchetto cliccando sul collegamento presente nel menu"Start/Programmi/EasyPHP”; effettuata questa operazione dovrebbeapparire un’icona nella barra di sistema vicino all’orologio. Fare clic suquesta per accedere al menù e selezionare l’opzione ‘Avvia’.Apparirà a video una finestra simile a quella che segue, che segnala ilcorretto avvio del server Apache e del db MySQL (Figura 2.7).

Aprire una finestra di browser e collegarsi all’indirizzo http://127.0.0.1/(l’indirizzo IP con il quale la macchina chiama se stessa). Nel caso in

Figura 2.7: Avvio di EasyPHP

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 27

Page 30: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet28

L’ambiente di sviluppoLAVORARE CON

INTERNET

cui tutto sia stato eseguito correttamente, dovrebbe comparire la scrit-ta di presentazione del prodotto.

Esecuzione di script con EasyPHP.Una volta scritto un programma PHP, bisogna fare in modo che questopossa essere eseguito da EasyPHP. Occorre, per questo, posizionare ifiles sotto la cartella “www” presente sotto PHP. Creare, sotto la direc-tory “www”, una cartella per ogni progetto che desideriamo eseguire,e sotto ognuna di queste, posizionare i files appropriati. Lanciare PHP e connettersi, tramite browser, all’indirizzo http://127.0.0.1o http://localhost , EasyPHP proporrà automaticamente una pagina dipartenza con la lista dei progetti che abbiamo disposto sotto “www”.

Easy PHP e PHP5Negli esempi che andremo ad illustrare nel corso del libro verrà utiliz-zata la versione 5 di PHP. La scelta è stata fatta perché PHP5 miglioranotevolmente i punti deboli delle versioni precedenti del linguaggio.Esso offre un completo supporto per la programmazione ad oggettiavvicinandosi, così, ai concetti espressi da Java. Inoltre – ed è questa lacaratteristica che, come vedremo, verrà sfruttata maggiormente - è sta-ta introdotta la possibilità di estrarre informazioni da documenti XML,di cui si conosca la struttura, in maniera immediata e con l’utilizzo di po-chissime righe di codice. Questa nuova estensione si chiama SimpleXMLe viene trattata nel paragrafo successivo. EasyPHP supporta PHP5 a partire dalla versione 2.0 che, nel momentoin cui scriviamo, è ancora in versione beta. È comunque possibile inclu-dere il supporto PHP5 anche nella versione 1.8, l’ultima distribuzione sta-bile.Per fare ciò è sufficiente scaricare la versione 5 di PHP dal sitohttp://www.php.net/downloads.php seguendo il cammino Windowsbinaries > PHP 5.2.3 zip package ed operare come segue:1. Creare una cartella php5 sotto la root di EasyPHP (supponiamo chesia c:\EasyPHP\)

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 28

Page 31: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 29

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

2. Decomprimere sotto tale cartella lo zip scaricato

3. Modificare il file httpd.conf, situato sotto la directory c:\EasyPHP\apache\conf\,come segue:

a. Rimpiazzare LoadModule php4_module"c:/EasyPHP/php/php4apache.dll" con LoadModule php5_module "c:/EasyPHP/php5/php5apache.dll"

b. Rimpiazzare AddModule mod_php4.c con AddModule mod_php5.c

c. Aggiungere php5 alla riga DirectoryIndex index.html index.shtml index.wml index.pwml index.php index.php3 index.php4 index.php5

d. Aggiungere .php5 alla riga AddType application/x-httpd-php .phtml .pwml .php3 .php4 .php5 .php .php2 .inc

4. Modificare il file C:/EasyPHP/php.ini come segue:

a. Rimpiazzare extension_dir = "${path}\php\extensions\" conextension_dir = "${path}\php5\ext\"

b. Rimpiazzare : include_path = "${path}\php\pear\" con include_path = "${path}\php5\PEAR\"

c. Aggiungere la riga extension=php_mysql.dll

5. Copiare il file c:\EasyPHP\php5\libmysql.dll nella directory c:\windows\sy-stem32\

6. Avviare EasyPHP

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 29

Page 32: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet30

L’ambiente di sviluppoLAVORARE CON

INTERNET

A questo punto anche la nostra installazione EasyPHP supporta PHP5.Non resta, adesso, che passare ad introdurre l’utilizzo di SimpleXML,l’estensione per la gestione XML cui avevamo fatto cenno in preceden-za e che è abilitata di default all'interno del motore PHP5.

SIMPLEXML, GESTIONE XML CON PHP5Con il termine parsing di un documento XML intendiamo tutte le azio-ni di accesso, modifica e interrogazione del documento. La libreria Sim-pleXML (in Figura 2.8 il sito di riferimento) possiede una interfaccia adoggetti semplice ed intuitiva, che permette, con pochissime righe di co-dice, di accedere agli elementi interessati seguendo la struttura del fi-le XML anche nella rappresentazione interna.Vediamo, a mò di esempio, come parsare un documento XML con Sim-pleXML.

<?xml version='1.0' standalone='yes'?>

<biblioteca>

Figura 2.8: Il sito di riferimento della libreria SimpleXML.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 30

Page 33: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 31

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

<libro>

<titolo>I promessi Sposi</titolo>

<autore>Alessandro manzoni</autore>

<argomento>Romanzo Storico</argomento>

<informazioni>

<editore>Mondadori</autore>

<prezzo>10</argomento>

</informazioni>

</libro>

<libro>

<titolo>La ragazza di Bube</titolo>

<autore>Carlo Cassola</autore>

<argomento>Romanzo</argomento>

<informazioni>

<editore>Rizzoli</autore>

<prezzo>8</argomento>

</informazioni>

</libro>

<libro>

<titolo>Apocalittici e Integrati</titolo>

<autore>Umberto Eco</autore>

<argomento>Saggio</argomento>

<informazioni>

<editore>Bompiani</autore>

<prezzo>8</argomento>

</informazioni>

</libro>

</biblioteca>

SimpleXML utilizza la funzione simplexml_load_string() per l'accesso adun documento XML. Viene caricato, all'interno di un oggetto SimpleXML,il contenuto del file XML passato come parametro. L'oggetto restituito

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 31

Page 34: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet32

L’ambiente di sviluppoLAVORARE CON

INTERNET

rappresenta la root del documento XML ed espone un attributo perogni tag figlio, attributo che può essere un array (nel caso ci siano piùtags omonimi come figli) o singolo elemento. L’accesso a tali attributi vie-ne effettuato utilizzando la sintassi consuete per l’accesso agli elemen-ti di un array.Per esempio, supponendo che il documento XML sia caricato nella va-riabile $biblioteca_xml, per visualizzare a video il primo autore presen-te nell’elenco è sufficiente il codice:

$biblio = simplexml_load_string($biblioteca_xml);

echo $biblio ->libro[0]->autore;

Tramite a funzione simplexml_load_string() è possibile anche effettua-re il parsing di entità multiple all’interno della gerarchia XML. Per esem-pio, per isolare la lista completa degli autori, è sufficiente ricorrere adun semplice ciclo iterativo:

$biblio = simplexml_load_string($biblioteca_xml);

foreach ($biblio->libro as $libro)

{

echo $libro->autore.'<br />';

}

Abbandoniamo, per ora, SimpleXML e passiamo a presentare l’ultimostrumento di lavoro, che ci permetterà di effettuare chiamate a servizioremoti: LibCurl.

LIBCURL, UNA LIBRERIA PER COLLEGAMENTI REMOTILibCurl è una libreria, creata da Daniel Stenberg, che permette la comu-nicazione con macchine remote utilizzando una vasta gamma di proto-colli di rete (in Figura 2.9 l’home page del progetto). Al momento ven-

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 32

Page 35: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 33

L’ambiente di sviluppoCapitolo 2LAVORARE CONINTERNET

gono supportati i seguenti protocolli: http, https, ftp, gopher, telnet,dict, file, e ldap. Oltre a questo vengono gestiti anche certificati HTTPSed è possibile utilizzare il protocollo ftp per l’upload di files. EasyPHP contiene l’estensione per libCurl; per abilitarla è sufficienteaprire il file php.ini ed andare a decommentare la riga ;extension=php_curl.dll.

Per iniziare una sessione di curl utilizzare l’istruzione curl_init(). Suc-cessivamente settare le opzioni per la sessione tramite la funzione PHPcurl_setopt(). Una volta settate le proprietà desiderate eseguire la ri-chiesta con currl_exec(), e chiudere la sessione.

<?

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');

curl_setopt($ch, CURLOPT_HEADER, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$data = curl_exec();

curl_close($ch);

?>

Figura 2.9: Home page del progetto LibCurl: http://curl.haxx.se/.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 33

Page 36: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 2

I libri di ioPROGRAMMO/Lavorare con Internet34

L’ambiente di sviluppoLAVORARE CON

INTERNET

Nell’esempio sono state settate tre proprietà: CURLOPT_URL corrispon-de all’url a cui collegarsi; CURLOPT_HEADER per specificare se deve es-sere ritornato l’header della risposta del server; CURLOPT_RETURN-TRANSFER settato ad 1 in modo che una risposta venga ritornata. Que-sta viene memorizzata nella variabile $data.

Capitolo 2 (017-034):007-050 31-08-2007 17:00 Pagina 34

Page 37: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 35

API di GoogleCapitolo 3LAVORARE CONINTERNET

API DI GOOGLE

Sul Web è possibile trovare moltissime risorse che forniscono datiutili a creare dei mashup. Tra le risorse di maggior interesse c’è il giàcitato ProgrammableWeb che è specifico per i mashup. Per quantoconcerne le collezioni di Web Services, si può trovare in http://www.strikei-ron.com e http://www.xmethods.net un’ottima collezione di servizi.Però Google ha una serie di servizi di prim’ordine; il più interessan-te è senz’altro Google Maps…

GOOGLE MAPSGoogle Maps ha rivoluzionato, sin dalla sua introduzione, il modo concui gli utenti consultano mappe on-line. Ora si analizzerà la struttura diquesta applicazione fornendo anche un primo esempio della sempli-cità con cui è possibile integrarla nel proprio sito web; successivamen-te le Google Maps saranno usate in moltissimi esempi del libro.

Che cosa sonoPer Google Maps si intende un servizio, rilasciato da Google, che permet-te agli utenti di cercare e visualizzare, all’interno di un browser, mappegeografiche che coprono quasi tutta la terra. Il servizio è accessibile viaweb al sito http://maps.google.it/ ed è strutturato tramite mappe dina-miche di semplice utilizzo. Le cartine fornite possiedono interessanti ca-ratteristiche interattive; per esempio basta tenere premuto il mouse suun qualsiasi punto per spostarsi sulla mappa a proprio piacimento ed inol-tre, tramite un intuitivo sistema di bottoni a forma di frecce, si riesce, inmaniera molto semplice, ad aumentare o diminuire il dettaglio di visua-lizzazione, effettuando veri e propri zoom.Un’altra caratteristica estremamente interessante di Google Maps èquella di rendere disponibile, oltre alla mappa stradale, anche la map-pa satellitare (ottenuta utilizzando il motore Google Hearts). Le due ti-pologie di mappa sono visualizzabili separatamente, ma è possibile an-

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 35

Page 38: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 3

I libri di ioPROGRAMMO/Lavorare con Internet36

API di GoogleLAVORARE CON

INTERNET

che sovrapporle, visualizzando, in questo modo, sia la toponomasticadelle strade che la loro reale morfologia.Oltre a questo è possibile trovare il percorso migliore per andare da unluogo ad un altro (utilizzando così il servizio come un vero e proprio na-vigatore satellitare) oppure ricercare e localizzare, sulla mappa, serviziquali ristoranti, negozi, luoghi turistici o istituzionali.Recentemente Google ha aggiunto una nuova prospettiva alle propriemappe: è disponibile, infatti, il servizio denominato “Street View”, chepermette di esplorare le città non più dall’alto ma direttamente dal li-vello stradale, dando l’impressione all’utente di stare camminando perla città. Insomma, vere e proprie camminate virtuali, con la possibilità dieffettuare zoom e di scegliere il percorso decidendo, di volta in volta,se girare a destra o a sinistra. Dopo aver brevemente illustrato in cosa consistono le Google maps,iniziamo ad esplorarne la struttura tramite un primo, semplice esempiodi integrazione di questo servizio in una nostra pagina web.

Google Maps API: come funziona? Per l’inserimento e la gestione delle proprie mappe all’interno di sitiweb, Google mette a disposizione degli sviluppatori un insieme di pro-cedure scritte in Javascript, dette Google Maps API, la cui documenta-

Figura 3.1: esempio di Google Maps

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 36

Page 39: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 37

API di GoogleCapitolo 3LAVORARE CONINTERNET

zione dettagliata è consultabile all’indirizzo http://www.google.com/apis/ma-ps/documentation/. Si tratta di uno strumento gratuito che offre una serie di funzioni per lamanipolazione e gestione delle mappe e che, soprattutto, permette diinserire, in maniera agevole, Google Maps nelle proprie pagine Webtramite Javascript. Queste API sono di facile utilizzo ed estremamenteversatili e potenti; nei paragrafi successivi vedremo come sia possibileutilizzarle per creare una mappa impiegando solo poche righe di co-dice JavaScript.Per poter utilizzare le API Google Maps all’interno del proprio sito webè però necessario ottenere una Google Maps API Key, che va richiestadirettamente a Google. Vediamo di che si tratta e come fare per procu-rarsela.

Ottenere una chiaveIl servizio Google Maps è gratuito ma occorre procurarsi una chiave perl’utilizzo delle API, quella che, comunemente, viene chiamata API Key.Una API Key altro non è che un codice alfanumerico che identifica uni-vocamente l'URL (o una sottopagina di questo URL) che andrà ad uti-lizzare le mappe. Per ottenere una API Key è sufficiente collegarsi alla pagina http://maps.goo-

Figura 3.2: Form per la richiesta di Api Key

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 37

Page 40: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 3

I libri di ioPROGRAMMO/Lavorare con Internet38

API di GoogleLAVORARE CON

INTERNET

gle.com/apis/maps/signup.html, indicare l'indirizzo per il quale si ha in-tenzione di utilizzare il servizio (per es. http://www.miosito.it/) e pre-mere il bottone Generate API Key. Verrà generata una stringa di lettere e numeri piuttosto lunga simile aquella riportata nella figura sottostante. Salvatela in un file di testopoiché ci servirà a breve.

È importante sottolineare che la chiave così ottenuta è valida solo peril dominio richiesto, per cui se sviluppate la vostra applicazione su di unserver locale (su dominio localhost) e, successivamente, vorrete effet-tuare il trasferimento dei files su di un server di produzione, dovreteprocurarvi due differenti API keys. Detto questo, vediamo come utilizza-re la chiave ottenuta per creare una mappa e comprendere i concetti fon-damentali della Google Maps API.

Impostazione della prima mappaCome avrete notato, insieme alla chiave viene fornito anche un primo,semplice esempio di come dovrebbe essere strutturata una pagina web

Figura 3.3: la chiave generata da Google

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 38

Page 41: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 39

API di GoogleCapitolo 3LAVORARE CONINTERNET

contenente una Google Maps. Copiamo l’esempio (viene fornito perquesto, ovviamente) sostituendo la chiave con quella fornitaci da Goo-gle e salviamo il codice sul file esempio1.html. A questo punto diamo un’occhiata al codice fornitoci da Google in mo-do da comprendere i meccanismi di base dell’utilizzo delle API. Tutta lalogica sta dentro la funzione Javascript load(), che consiste nelle duerighe di codice Javascript riportate nella porzione di codice sottostante.

var map = new GMap2(document.getElementById("map"));

map.setCenter(new GLatLng(37.4419, -122.1419), 13);

Proviamo a capirne il significato.La prima riga instanzia un oggetto Javascript di tipo GMap2 e lo asse-gna alla variabile map. L’oggetto GMap2 rappresenta la mappa vera epropria. Quindi in questo modo si crea la mappa e la si pone, nella pa-gina HTML, all’interno della sezione contrassegnata dal tag “DIV” cheha come identificativo il nome “map”.Nella seconda riga viene utilizzato metodo setCenter() che si occupadi “puntare” la mappa su una determinata locazione geografica. Vedia-mo come questa operazione viene effettuata.Il metodo setCenter accetta due parametri: un punto geografico ed il li-vello di zoom con cui la mappa sarà visualizzata. Nelle api Google Ma-ps il concetto di punto è espresso dalla funzione GLatLng() che accet-ta a sua volta due parametri: la latitudine e la longitudine in formato de-cimale. Per cui la funzione che stiamo esaminando centra la mappa sul-le coordinate geografiche 37.4419 e –122.1419 con un livello di zoompari a 13.Potete provare l’esempio sostituendo le coordinate fornite da Google conquelle delle località che preferite, le cui coordinate possono essere re-perite utilizzando il servizio fornito da http://world.maporama.comNel corso del libro, comunque, impareremo ad ottenere in maniera di-namica le coordinate geografiche a partire da una località, da un indi-rizzo o dall’IP di un server.

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 39

Page 42: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 3

I libri di ioPROGRAMMO/Lavorare con Internet40

API di GoogleLAVORARE CON

INTERNET

Tornando al nostro esempio, nel corso dell’introduzione si era accenna-to alla possibilità di muoversi ed effettuare zoom sulla mappa nonchédi visualizzare, in alternativa alla mappa stradale, la mappa satellitareoppure un ibrido ottenuto sovrapponendo i due tipi. Bene, possiamogià arricchire la nostra mappa fornendo sia la barra di navigazione, ag-giungendo la riga map.addControl(new GLargeMapControl());, che i pul-santi per selezionare le diverse modalità di visualizzazione, tramite la ri-ga map.addControl(new GMapTypeControl());Il codice della funzione verrà quindi modificato come segue

var map = new GMap2(document.getElementById("map"));

map.setCenter(new GLatLng(37.4419, -122.1419), 13);

map.addControl(new GLargeMapControl()); // aggiunge barra navigazione

map.addControl(new GMapTypeControl()); //

aggiunge scelta visualizzazione

Il problema dei test localiSe il server risiede sulla propria macchina di sviluppo a cui non è asse-gnato un dominio, si potrebbe avere il problema che il servizio di Goo-gle non riconosce il dominio per cui la chiave è stata registrata. La so-luzione più semplice è quella di creare un alias, ovvero un nome simbo-lico che viene “tradotto” in un indirizzo IP specifico. Per crearlo editareil file hosts e usare un alias a propria scelta che poi verrà usato per ge-nerare la chiave di Google. In Windows XP il file da editare è C:\WINDOWS\sy-stem32\drivers\etc\hosts, in un sistema GNU/Linux il file è posizionatoin /etc/hosts per i test Java è stato creato l’alias sitodiprova.it per l’in-dirizzo IP locale, ovvero 127.0.0.1 (Figura 3.4):

127.0.0.1 localhost sitodiprova.it

Ora è possibile ottenere la chiave di Google per l’indirizzo sitodiprova.ite usarla per i propri test locali!

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 40

Page 43: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 41

API di GoogleCapitolo 3LAVORARE CONINTERNET

DATI DA GOOGLE? GDATA!Google offre numerosi altri servizi oltre le Google Maps. Essi spazianodal servizio Blogger (per la creazione di blog) a Calendar (calendariopersonale con possibilità di condivisione tra più persone) ad applica-zioni di produttività indivisuale (spreadsheet ed editor). Un’interessan-te caratteristiche di tutte queste applicazioni è che possiedono delleAPI il cui modello di interscambio è comune. Tale modello è chiamatoGData (Google Data), e le API sono descritte alla paginahttp://code.google.com/apis/gdata/index.html (Figura 3.5). Oltre alleAPI Google pubblica anche librerie pronte per essere usate nei più co-muni linguaggi di programmazione, tra cui Java (versione 1.5), .NET,PHP, Python e Objective-C. Sta crescendo il supporto anche per il lin-guaggio JavaScript che, per ora, include la possibilità di usare le appli-cazioni Blogger, Calendar, Spreadsheet e Google Base.Negli esempi a seguire si mostrerà, tra le altre cose, alcune applicazio-ni che fanno uso di Calendar.

Figura 3.4: Google non riconosce il server locale come corretto? Usare un

alias!

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 41

Page 44: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 3

I libri di ioPROGRAMMO/Lavorare con Internet42

API di GoogleLAVORARE CON

INTERNET

Figura 3.5: Librerie GData per l’accesso ai dati di Google.

Capitolo 3 (035-042):007-050 31-08-2007 17:03 Pagina 42

Page 45: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 43

Il primo mashupCapitolo 4LAVORARE CONINTERNET

IL PRIMO MASHUP

In questo capitolo si vedrà come realizzare un primo mashup. L’e-sempio verrà analizzato e implementato sia in Java che PHP (di se-guito non ci sarà più questa ambivalenza: via via verranno presen-tati mashup realizzati o con una o con l’altra tecnologia).

IL PROBLEMASi vorrebbe far sì che per ogni visitatore del sito appaia una mappacentrata sul posto da dove il visitatore proviene. Per provenienza siintende la localizzazione della connessione ad Internet e non le im-postazioni del browser (o sistema operativo) per la lingua. Un simi-le problema potrebbe essere affrontato ogni qualvolta si voglianooffrire delle informazioni personalizzate (turistiche, commerciali osemplicemente informative) in base al riconoscimento della prove-nienza della sua connessione. Così se uno utilizza il proprio portati-le da casa, si vedrà recapitare informazioni vicine alla sua casa, se loutilizza all’estero (per lavoro o vacanza) le informazioni del sito siriferiranno alla sua nuova locazione.Per la creazione della mappa si può scegliere tra Google Maps oYahoo Maps. Nell’esempio si sceglierà Google Maps, le cui API so-no state descritte in precedenza.

LOCALIZZARE UN INDIRIZZO IPTra i diversi servizi a disposizione due sono particolarmente indicatiper risolvere il nostro problema: uno è il servizio (gratuito) fornitocome CGI da http://api.hostip.info. Il servizio di interesse risponde al-la pagina http://api.hostip.info/get_html.php e si possono passare dueparametri. Il primo (ip) indica l’ip da analizzare, il secondo (position)indica se si vuole, tra i risultati, anche la latitudine e la longitudinedella localizzazione. Per esempio si provi ad aprire il seguente indi-rizzo con un browser:http://api.hostip.info/get_html.php?position=true&ip=71.170.59.170

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 43

Page 46: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet44

Il primo mashupLAVORARE CON

INTERNET

la pagina risultante fornisce le informazioni di georeferenziazionecercate, come mostrato in Figura 4.1

Dopo alcune prove sul servizio si può notare che molti indirizzi ita-liani non sono risolti correttamente (mentre lo sono quasi tutti quel-li statunitensi). Ricercando servizi alternativi si può trovare che suhttp://www.maxmind.com/ c’è GeoIP, un database da scaricare eusare in locale all’applicazione e che permette di risalire alla localiz-zazione degli IP. Non solo: sul sito sono presenti anche le classi (di-sponibili in diversi linguaggi tra cui Java e PHP) per leggere i conte-nuti della base dati. Le prove hanno evidenziato che questa soluzio-ne permette di risolvere anche gran parte degli indirizzi ip prove-nienti dall’Italia. Pertanto si farà uso anche di tale servizio (confron-tando i risultati ottenuti con il servizio precedente, in termini di perfor-mance ma anche di altre caratteristiche meno ovvie (costi di svilup-po, manutenzione, affidabilità e così via).

REALIZZARE L’APPLICAZIONEEssendo il primo servizio realizzato, verrà mostrata sia una imple-

Figura 4.1: le informazioni relative all’indirizzo ip di esempio

(71.170.59.170).

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 44

Page 47: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 45

Il primo mashupCapitolo 4LAVORARE CONINTERNET

mentazione in Java che una in PHP. Nel seguito si sceglierà una del-le due tecnologie per realizzare gli altri mashup.

L’applicazione JavaL’applicazione Java si compone di due parti: una di reperimento del-le informazioni ed una di visualizzazione. La prima consiste nel rea-lizzare una o più classi che, opportunamente configurate, permet-tono di restituire le informazioni di georeferenziazione. La secondaparte si compone di pagine Jsp ed eventuali pagine di supporto (CSSo JavaScript).

Una classe per i dati: InfoPointLa prima classe che si descrive è InfoPoint. Essa non è altro cheun Java Bean con le seguenti proprietà: città, stato, latitudine,longitudine e tempoGenerazione. Le prime quattro sono le pro-prietà utili per la georeferenziazione, l’ultima è solo un’informa-zione che sarà utile per delle statistiche sui tempi di generazionedei dati dal server. Un JavaBean non è altro che una classe Javacon tutte le proprietà private e i metodi per leggere/scrivere taliproprietà che hanno la convenzione sul nome per cui il metodo chelegge la proprietà pippo è chiamato getPippo, quello che la scri-ve setPippo (vista la semplicità della classe InfoPoint essa è pre-sente nei sorgenti allegati e non riportata nel libro; lo stesso saràfatto per le classi concettualmente banali e che non richiedono ul-teriori spiegazioni).

AttenzioneDa qui in seguito si userà un particolare package per includere leclassi sviluppate. Tale package inizia sempre con it.ioprogrammo.ma-shup e pertanto non verrà esplicitato. Talvolta si useranno packagepiù specifici; solo in ques’ultimo caso si farà riferimento al packageusato.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 45

Page 48: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet46

Il primo mashupLAVORARE CON

INTERNET

Reperire i dati: LocalizzaIpLa classe LocalizzaIp.java avrà il compito di risolvere, usando un ser-vizio esterno, la georeferenziazione di un indirizzo IP. Il primo meto-do che si analizza è infoUrl: esso si occupa di invocare la paginahttp://api.hostip.info/get_html.php con gli opportuni parametri ed ese-guire il parsing del risultato:

public InfoPoint infoUrl(String ip){

long tempo = (new java.util.Date()).getTime();

InfoPoint res = null;

try {

if (ip.equals("127.0.0.1"))

ip=ipTest;

res = new InfoPoint();

URL url = new URL(urlServizio + ip);

BufferedReader instr =

new BufferedReader(

new InputStreamReader(url.openStream()) );

String rigaLetta;

int righe = 0;

while (righe<4){

rigaLetta = instr.readLine();

System.out.println(righe+"> '"+rigaLetta+"'");

parsingRiga(righe, rigaLetta, res);

righe++;

}

} catch (Exception e) {

e.printStackTrace();

} finally{

if (res!=null)

res.setTempoGenerazione(

(new java.util.Date()).getTime() - tempo);

}

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 46

Page 49: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 47

Il primo mashupCapitolo 4LAVORARE CONINTERNET

return res;

}

Si noti che nel caso in cui l’IP sia 127.0.0.1 (ovvero il test viene fat-to in locale) si usa un IP predefinito.Il parsing è piuttosto semplice, visto che il risultato è dato da più ri-ghe di testo (dove ciascuna riga è un’informazione ed è formata daetichetta:valore):

private void parsingRiga(int righe, String rigaLetta, InfoPoint res){

String dato = rigaLetta.substring(rigaLetta.indexOf(":")+1);

double val = 0;

switch(righe){

case 0:

res.setStato(dato);

break;

case 1:

res.setCitta(dato);

break;

case 2:

try{

val = Double.parseDouble(dato);

}catch(NumberFormatException e){;}

res.setLatitudine(""+val);

break;

case 3:

try{

val = Double.parseDouble(dato);

}catch(NumberFormatException e){; }

res.setLongitudine(""+val);

}

}

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 47

Page 50: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet48

Il primo mashupLAVORARE CON

INTERNET

Ecco invece la funzione che georeferenzia un indirizzo IP usando ildatabase GeoIP:

public InfoPoint infoGeo(String ip){

long tempo = (new java.util.Date()).getTime();

InfoPoint res=null;

try{

if (ip.equals("127.0.0.1"))

ip = ipTest;

Location l1 = cl.getLocation(ip);

if (l1!=null){

InfoPoint infop = new InfoPoint();

infop.setCitta( l1.city );

infop.setStato(l1.countryName);

infop.setLatitudine(""+l1.latitude);

infop.setLongitudine(""+l1.longitude);

res=infop;

}

} finally{

if (res!=null)

res.setTempoGenerazione(

(new java.util.Date()).getTime() - tempo);

}

return res;

}

Come si vede la classe fa uso di cl, la quale è un attributo della clas-se così dichiarato:

private static LookupService cl = null;

Inoltre esso va inizializzato; in particolare questo avviene nel co-struttore della classe:

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 48

Page 51: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 49

Il primo mashupCapitolo 4LAVORARE CONINTERNET

private LocalizzaIp(){

try{

cl = new LookupService(pathGeoLiteCity,

LookupService.GEOIP_MEMORY_CACHE

| LookupService.GEOIP_CHECK_CACHE );

}catch(Exception ex){

ex.printStackTrace();

}

}

La classe LookupService, insieme ad altre classi per l’accesso allabase dati degli indirizzi, è scaricabile dalla pagina Web http://www.max-mind.com/app/api (far riferimento alla documentazione inclusa perl’utilizzo delle API fornite).

La parte di visualizzazioneOttenute le informazioni, in un oggetto di tipo InfoPoint, è neces-sario creare una Google Map che mostri un marcatore sulla posi-zione data dalla longitudine e latitudine calcolati, nonché centratasul punto stesso. La parte di visualizzazione si compone di due file:localizzaIp.jsp, che contiene il codice html con la mappa e la dichia-razione delle funzioni JavaScript da usare, e dati-locale.jsp, che è unfile contenente solo codice JavaScript ma con una parte dinamica(fatta in JSP). Il primo file si compone, tra le altre cose, di due placehol-der per le due mappe: una che visualizzerà la mappa con le coordi-nate ottenute dal metodo infoUrl (che fa uso del servizio remoto ho-stInfo), l’altra che visualizzerà la mappa con le coordinate ottenutedal database locale GeoIp:

<div id="map1" class="map1"></div>

<div id="map2" class="map1"></div>

Tra il codice JavaScript della pagina localizzaIp ci sarà anche quello

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 49

Page 52: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet50

Il primo mashupLAVORARE CON

INTERNET

che si occupa dell’inizializzazione:

<script type = "text/javascript" src="./dati-locale.jsp"> </script>

<script type="text/javascript">

function load() {

if (GBrowserIsCompatible()) {

var map1 = new GMap2(document.getElementById("map1"));

disegnaPrima(map1);

var map2 = new GMap2(document.getElementById("map2"));

disegnaSeconda(map2);

}

}

</script>

Nel file dati-locale.jsp troverà posto il seguente codice:

String host = request.getRemoteHost();

Nella stringa host sarà contenuto l’Ip del visitatore. Da tale indiriz-zo ecco come ottenere la referenziazione usando GeoIp:

LocalizzaIp loc= LocalizzaIp.getInstance();

InfoPoint info = loc.infoGeo(host);

Ad esso corrisponderà la seguente funzione JavaScript per l’inizializ-zazione della mappa:

function disegnaPrima(mappa) {

var punti = new Array();

var gtext = new Array();

mappa.setCenter(

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 50

Page 53: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 51

Il primo mashupCapitolo 4LAVORARE CONINTERNET

new GLatLng(

<%= info.getLatitudine() %>,

<%= info.getLongitudine() %>),

8);

punti [0]=

new GLatLng (

<%= info.getLatitudine() %>,

<%= info.getLongitudine() %>);

gtext [0]= <%= dammiDescrizione(host, info) %>

disegnaMappa(mappa, punti, gtext);

}

In maniera simile ecco il reperimento delle informazioni dal serviziohostInfo:

<%

info = loc.infoUrl(host);

%>

e il disegno della relativa mappa:

function disegnaSeconda(mappa) {

var punti = new Array();

var gtext = new Array();

mappa.setCenter(

new GLatLng(

<%= info.getLatitudine() %>,

<%= info.getLongitudine() %>),

8);

punti [0]= new GLatLng (

<%= info.getLatitudine() %>,

<%= info.getLongitudine() %>

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 51

Page 54: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet52

Il primo mashupLAVORARE CON

INTERNET

);

gtext [0]= <%= dammiDescrizione(host, info) %>

disegnaMappa(mappa, punti, gtext);

}

Entrambe le funzioni JavaScript fanno uso della seguente funzione:

function disegnaMappa(mappa, punti, testo) {

mappa.addControl(new GLargeMapControl());

mappa.addControl(new GMapTypeControl());

for (i=0; i<punti.length; i++){

mappa.addOverlay (creaFumetto(punti[i],testo[i]));

}

}

In Figura 4.2 e 4.3 due esempi di indirizzi IP (nel primo caso risolticorrettamente da entrambi i servizi, nel secondo caso no!).

Figura 4.2: Un indirizzo IP (che vale 82.51.68.55) risolto correttamente da

entrambi i servizi.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 52

Page 55: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 53

Il primo mashupCapitolo 4LAVORARE CONINTERNET

L’APPLICAZIONE PHPCerchiamo di applicare anche alla parte PHP il pattern MVC ed unagestione ad oggetti. Il paradigma della programmazione orientata aglioggetti è stato introdotto con la versione 5 di PHP, in cui i progetti-sti hanno cercato di inserire concetti similjava. È possibile, quindi,sforzarsi per cercare di dare al nostro codice una struttura object-oriented e per disaccoppiare le componenti riguardanti logica dell’e-laborazione da quelle incaricate della visualizzazione dei risultati.In questo modo riusciremo ad ottenere codice con una migliore leg-gibilità e più facilmente modificabile.Il concetto di georeferenziazione resta, ovviamente, immutato ri-spetto a quanto introdotto in precedenza, in quanto indipendente dallinguggio utilizzato.

Una classe per i dati: infopointAnche nell’esempio php utilizzeremo una classe, analoga alla Info-

Figura 4.3: Un indirizzo IP (che vale 82.51.148.195) risolto correttamente

solo da GeoIP.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 53

Page 56: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet54

Il primo mashupLAVORARE CON

INTERNET

Point dell’esempio Java, i cui attributi saranno, anche in questo ca-so, i seguenti: città, stato, latitudine, longitudine e tempoGenera-zione. Una classe php è una struttura contenente una serie di attributi chepossono essere riferiti con la notazione

$nomeoggetto->nomeattributo

Il codice della classe infopoint (contenuto nel file infopoint.php) è estre-mamente semplice ed è il seguente:

class infopoint {

var $citta;

var $stato;

var $latitudine;

var $longitudine;

}

Reperimento dei datiAndiamo ad illustrare l’implementazione in PHP della funzione chegeoreferenzia un indirizzo IP tramite l’utilizzo del database GeoIP

<?php

include("geoipcity.inc");

include("infopoint.php");

function infoGeo($ip){

$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);

$record = geoip_record_by_addr($gi, $ip);

$infop = new infopoint();

$infop->latitudine = $record->latitude;

$infop->longitudine = $record->longitude;

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 54

Page 57: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 55

Il primo mashupCapitolo 4LAVORARE CONINTERNET

$infop->citta = $record->city;

$infop->stato = $record->country_name;

geoip_close($gi);

return $infop;

}

?>

La funzione accetta come parametro un indirizzo ip e restituisce unoggetto di tipo infopoint. Analizziamone sinteticamente il codice. Laprima istruzione restituisce, di fatto, una connessione al databaseGeoLiteCity.dat, la seconda ritorna un oggetto $record di classe dalquale estraiamo gli attributi che ci interessano per assegnarli ad unoggetto infopoint. Una volta chiusa la connessione viene ritornatol’oggetto infopoint.Attenzione: in questo esempio si suppone che il file GeoLiteCity.datsia posizionato nella stessa directory della pagina PHP. Se questonon fosse vero occorrerà settare il path relativo adeguato per acce-dervi.La funzione successiva si occupa di risolvere la georeferenziazionedell’indirizzo IP che riceve come parametro, mediante l’utilizzo del ser-vizio infoUrl.

function infoUrl($ip){

$record = file('http://api.hostip.info/get_html.php?ip='

. $ip.'&position=true');

$infop = new infopoint();

$infop->latitudine = substr($record[2], 11);

$infop->longitudine = substr($record[3], 12);

$infop->citta = substr($record[1], 8);

$infop->stato = $record->country_name;

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 55

Page 58: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet56

Il primo mashupLAVORARE CON

INTERNET

geoip_close($gi);

return $infop;

}

Componente di visualizzazioneAnche nell’implementazione PHP occorrerà, a partire dalla longitu-dine e dalla latitudine fornite dall’oggetto infopoint, generare una Goo-gle Map centrata sul punto così descritto. Analogamente a quanto visto in precedenza viene disaccoppiata laparte html contenente la mappa da quella riguardante le funzioni Ja-vascript.La parte di visualizzazione non si differenzia molto, concettualmen-te, da quanto visto nell’esempio Java. Le differenze, essenzialmen-te, riguardano la parte del codice generata dinamicamente, ma so-no tali solo per la differente sintassi del PHP rispetto a JSP. La parte contenente la mappa è pressochè identica, eccezion fattaper la sintassi con cui vengono inclusi gli header ed i footer dellapagina e per i riferimenti alla pagine javascript.

<script type = "text/javascript" src="./datilocale.php"> </script>

Nel file datilocale.php si trova il seguente codice che assegna alla va-riabile denominata host l’ip del visitatore.

$host = getenv("REMOTE_ADDR");

Una volta ottenuto l’indirizzo del client viene invocata la funzione info-geo che, tramite l’utilizzo di GeoIP, ritorna le coordinate geografi-che relative all’ip chiamante.

$info = infoGeo($host);

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 56

Page 59: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 57

Il primo mashupCapitolo 4LAVORARE CONINTERNET

La funzione JavaScript per l’inizializzazione della mappa corrispon-dente differisce in maniera minima rispetto alla sua analoga in am-biente JSP. Le differenze, come accennato in precedenza, riguarda-no solo la differente sintassi per richiamare dinamicamente la lati-tudine e la longitudine ottenute:

function disegnaPrima(mappa) {

var punti = new Array();

var gtext = new Array();

mappa.setCenter(

new GLatLng(

<?= $info->latitudine ?>,

<?= $info->longitudine ?>),

8);

punti [0]=

new GLatLng (

<?= $info->latitudine ?>,

<?= $info->latitudine ?>);

gtext [0]= <?= dammi_descrizione($host, $info) ?>

disegnaMappa(mappa, punti, gtext);

}

Per la referenziazione tramite il servizio hostinfo è invece utilizzatoil seguente codice:

$info = infoUrl($host);

Viene restituita una istanza della classe infopoint di cui vengono uti-lizzati gli attributi latitudine e longitudine per generare dinamica-mente la funzione javascript di disegno della mappa:

function disegnaSeconda(mappa) {

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 57

Page 60: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet58

Il primo mashupLAVORARE CON

INTERNET

var punti = new Array();

var gtext = new Array();

mappa.setCenter(

new GLatLng(

<?= $info->latitudine ?>,

<?= $info->longitudine ?>),

8);

punti [0]= new GLatLng (

<?= $info->latitudine ?>,

<?= $info->longitudine ?>),

);

gtext [0]= <?= dammi_descrizione($host, $info) ?>

disegnaMappa(mappa, punti, gtext);

}

Allo stesso modo dell’esempio Java ecco, di seguito, il risultato deidue esempi sviluppati in PHP: il primo con un indirizzo che entram-bi i servizi sono riusciti a risolvere, il secondo con un indirizzo che so-lamente GeoIP è riuscito a referenziare (Figure 4.4 e 4.5)

Figura 4.4: Un indirizzo IP risolto correttamente da entrambi i servizi.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 58

Page 61: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 59

Il primo mashupCapitolo 4LAVORARE CONINTERNET

CONSIDERAZIONI SULL’ESEMPIOL’esempio che fa uso del CGI per reperire le informazioni relative alla lo-calizzazione dell’indirizzo IP e l’uso di Google Maps per la sua visualiz-zazione è senz’altro un esempio di mashup (infatti si usano due servi-zi separati, ciascuno acceduto sul Web). Si può dire la stessa cosa nel ca-so in cui la localizzazione è presa da una base dati locale? Probabil-mente no; però si vede subito la difficoltà nel definire il termine ma-shup. È chiaro che per l’utente finale in fondo il risultato è lo stesso.Inoltre, anche nel primo esempio, si può esservare come le informazio-ni reperite in rete siano “risolte” in due momenti diversi: il CGI viene in-vocato lato server (via codice Java o PHP) mentre le mappe vengonoinvocate lato client (via codice JavaScript). È un classico esempio di ma-shup ibrido. Altri contesti potrebbero prevedere mashup solo lato ser-ver o solo lato client. Quali preferire? Ovviamente non c’è (come spes-so accade) una risposta definitiva, ma ciascuna soluzione presenta al-cuni vantaggi e alcuni aspetti critici…

Mashup lato clientUn mashup solo lato client ha il vantaggio di non appesantire il ser-

Figura 4.5: Un indirizzo IP risolto correttamente solo da GeoIP.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 59

Page 62: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 4

I libri di ioPROGRAMMO/Lavorare con Internet60

Il primo mashupLAVORARE CON

INTERNET

ver di ulteriori elaborazioni. Questo può essere particolarmente im-portante per le applicazioni a cui accedono molti utenti. Inoltre è in-dubbio che ciascun utente vedrà sempre le informazioni aggiorna-te non appena queste vengono messe a disposizione dai siti chefungono da sorgente dati. Il problema principale è realizzare appli-cazioni davvero cross browser, ovvero che funzionino con i diversibrowser presenti sul mercato. Questa caratteristica fa sì che è pre-feribile usare librerie Ajax piuttosto che pensare di realizzarne diproprie ad hoc. Infatti lo sviluppo di applicazioni cross browser èun’attività piuttosto specifica e complessa, sia per il bagaglio di co-noscenze richieste, sia per la difficoltà di test esaustivi.

Mashup lato serverFornire dei mashup risolti già a livello server porta a “spendere” piùrisorse sul server dell’applicazione, ma questa può avvalersi di for-me di cache dei dati che può portare a notevoli vantaggi sia in ter-mini di performance (in quanto i dati sono reperiti da una cache lo-cale e non sempre da remoto; in tal senso si confrontino i tempi di“risoluzione” degli indirizzi IP dell’esempio realizzato: accedere aduna risorsa attraverso una chiamata http è quasi sempre più lento cheaccedere ad una base dati locale) ma anche di evitare che i propri uten-ti intasino di richieste i server che fungono da sorgenti di dati (spes-so questa caratteristiche è una richiesta fatta da server che espon-gono i dati!). Per questo motivo la gran parte dei mashup, quandopossibile, viene risolta direttamente lato server.

Capitolo 4 (043-060):007-050 31-08-2007 17:05 Pagina 60

Page 63: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 61

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

MAPPE CON IL METEO E GEOCODING

In Il senso di un’applicazione di mashup che utilizzi le mappe di Goo-gle è quello di disegnare una mappa mettendo in relazione le infor-mazioni che vogliamo rappresentare con una latitudine ed una lon-gitudine. Vi sono numerosi servizi di geocoding che, a partire da unindirizzo postale, restituiscono con precisione le coordinate geogra-fiche corrispondenti. Nel corso di questo capitolo verrà illustrataun’applicazione che, acquisendo come parametro di ingresso un in-dirizzo postale, visualizzerà la mappa centrata su tale indirizzo e leinformazioni meteorologiche relative all’area geografica (la provin-cia) richiesta. Per il mashup verranno utilizzati:

� Il servizio web di geocoding di Google� Google Maps� Il servizio metereologico weather.com

GOOGLE MAPS API GEOCODERUn servizio di geocoding, abbiamo detto, restituisce la latitudine e lalongitudine corrispondenti ad un indirizzo postale inviato come pa-rametro. Le informazioni restuite dai servizi di geocoding sono informato XML, ed ogni servizio restituisce un formato proprio. Dun-que per usufruire di questi servizi occorre connettersi ad essi, perpoi ottenere una risposta in formato XML che andrà poi parserizza-ta per ottenere le informazioni (latitudine e longitudine) di cui neces-sitiamo per la nostra applicazione.Lo strumento di geocoding analizzato sarà il Google Maps API geo-coder, accessibile all’indirizzo http://www.google.com/apis/maps/do-cumentation/#Geocoding_Examples. Google assicura che questoservizio è in grado di garantire un dettaglio molto preciso per i seguen-ti paesi: Stati Uniti, Canada, Francia, Italia, Germania e Spagna.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 61

Page 64: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup62

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Il formato di Request e ResponseIl servizio accetta come parametro un indirizzo postale in un partico-lare formato, detto REST (acronimo per REpresentional State Transfer).Si tratta, di fatto, di una richiesta GET del protocollo HTTP, quindi diuna stringa composta da un URL seguito da un elenco di parame-tri url?chiave1=velore1&chiave2=valore2...Una particolarità estremamente interessante è che Google non im-pone particolari rigidità sulla formattazione dell’indirizzo inviato co-me parametro. Infatti non sono richiesti particolari campi separato-ri tra il nome della via, il numero, la città, la nazione ed il codice diavviamento postale. Il servizio analizza quanto gli viene fornito iningresso e prova a dedurne la risposta migliore da fornire. La rispo-sta che fornisce, contenente la latitudine e la longitudine ricavatedall’indirizzo, è invece strutturata in maniera ben precisa attraversol’utilizzo di un dialetto di XML detto KML (Keyhole Markup Langua-ge). Per esempio, una semplice richiesta di questo tipo:

http://maps.google.com/maps/geo?q=Via+Corridoni+12+56100+

Pisa+PI+Italia

Otterrà una risposta in formato XML analoga alla seguente:

<kml xmlns="http://earth.google.com/kml/2.0">

<Response>

<name>Via Corridoni 12 56100 Pisa PI Italia</name>

<Status>

<code>200</code>

<request>geocode</request>

</Status>

<Placemark id="p1">

<address>Via Filippo Corridoni, 12, 56125 Pisa, PI (Toscana),

Italy</address>

<AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 62

Page 65: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 63

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

xsdschema:xAL:2.0">

<Country>

<CountryNameCode>IT</CountryNameCode>

<AdministrativeArea>

<AdministrativeAreaName>Toscana</AdministrativeAreaName>

<SubAdministrativeArea>

<SubAdministrativeAreaName>PI</SubAdministrativeAreaName>

<Locality>

<LocalityName>Pisa</LocalityName>

<Thoroughfare>

<ThoroughfareName>Via Filippo Corridoni,

12</ThoroughfareName>

</Thoroughfare>

<PostalCode>

<PostalCodeNumber>56125</PostalCodeNumber>

</PostalCode>

</Locality>

</SubAdministrativeArea>

</AdministrativeArea>

</Country>

</AddressDetails>

<Point>

<coordinates>10.406862,43.706173,0</coordinates>

</Point>

</Placemark>

</Response>

</kml>

Il messaggio ritornato è contenuto nel tag Response suddiviso intre entità principali:

� name: Contiene il parametro inviato al geocoder� Status: Il codice di risposta, nell’esempio il codice è 200, che sta

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 63

Page 66: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup64

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

a significare che la richiesta è stata processata correttamente e cheè stata fornita una risposta.

� PlaceMark: questo tag è presente solo se la richiesta è andata abuon fine e contiene tutte le indicazioni richieste, in particolarecontiene l’entità Point (evidenziata in grassetto) all’interno dellaquale sono presenti le coordinate geografiche corrispondenti al-l’indirizzo postale richiesto.

Analizzati il formato delle richieste da inviare al Geocoder Google edelle conseguenti risposte ottenute, occorre costruire una classe cheinvii una richiesta ed elabori i dati ottenuti in risposta.Per richiedere il servizio web utilizzeremo il package CURL introdot-to nel Capitolo 2, mentre per la parserizzazione del dato in forma-to KML faremo ricorso alla libreria SimpleXML il cui funzionamentoè stato illustrato sempre nel Capitolo 2.

La funzione che utilizza il servizioIl codice che segue illustra la funzione PHP che utilizza CURL e Sim-pleXML per ritornare un oggetto di tipo infopoint a fronte di un in-dirizzo postale passato come parametro.

function infoAddress($postal_address)

{

$infop = new infopoint();

// Creazione oggetto CURL

$curl_obj = curl_init();

curl_setopt($curl_obj, CURLOPT_HEADER, 0);

curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, 1);

// Carica la chiave Google salvata nel file ApiKey.txt

$fh = fopen("ApiKey.txt", "r");

if (!$fh) die("Errore: Chiave per le API Google non trovata ");

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 64

Page 67: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 65

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

$api_key = fread($fh, filesize("ApiKey.txt"));

fclose($fh);

// Preparazione della stringa di richiesta

$url = ”http://maps.google.com/maps/geo?output=xml”;

$url .= “&key=$api_key”;

$url .= “&q=$postall_address”;

// Effettua la query a Google

curl_setopt($curl_obj, CURLOPT_URL, $url);

$geo_response = curl_exrc($curl_obj);

// Parsing della risposta

$geo_result = simplexml_load_string($geo_response);

$response_status = $geo_result->Response->Status->code;

if ($response_status != 200)

{

echo(“Impossibile soddisfare richiesta per questo indirizzo”; }

else

{

// Estrae le informazioni e le assegna all’oggetto infopoint

$coord = $geo_result->Response->Placemark->Point->coordinates;

$list($lat, $lon) = split(“,”, $coord);

$citta= $geo_result->Response->Placemark->Country

->AdministrativeArea-> SubAdministrativeAreaName;

$infop->latitudine = $lat;

$infop->longitudine = $lon;

$infop->citta = $citta;

}

curl_close($curl_object);

return $infop ;

}

La funzione instanzia un oggetto CURL e gli fornisce la richiesta RE-ST che viene trasmessa a Google e la cui risposta è contenuta nel-l’oggetto $geo_response che – abbiamo detto – è nel formato KML.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 65

Page 68: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup66

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Utilizzando semplicemente l’istruzione simplexml_load_string, for-nita dalla libreria Simple XML, tutte le informazioni contenute neldocumento KML vengono trasferite all’interno di una gerarchia dioggetti, facilmente navigabile, la cui radice è nell’oggetto $geo_re-sult.. L’estrazione della latitudine e della longitudine consiste sem-plicemente nel navigare l’oggetto sino al livello dell’entità coordina-tes. Con la stessa metodologia estraiamo la provincia che ci serviràper richiedere le relative previsioni meteo. Tali operazioni sono evi-denziate in grassetto nel codice precedente.La funzione così descritta può essere utilizzata ogni volta che si de-sideri reperire le coordinate geografiche di un determinato indirizzopostale. Per utilizzarla è necessario essere provvisti di una appositaGoogle key per il dominio utilizzato che, nell’esempio, abbiamo sup-posto essere salvata in un file denominato ApiKey.txt e posto al me-desimo livello di filesystem del file PHP contenente il codice. Occorre adesso utilizzare le coordinate ottenute per mostrare lamappa - centrata sul punto che esse descrivono – e le informazionimetereologiche relative. Per la visualizzazione delle previsioni meteoverrà utilizzato il servizio weather.org con le modalità descritte nelparagrafo seguente.

UN SERVIZIO METEO:WEATHER.COMPer acquisire informazioni meteorologiche riguardanti una determi-nata locazione geografica viene utilizzato il servizio fornito dal Na-tional Weather Service statunitense, raggiungibile all’indirizzohttp://weather.com.Una volta iscritti al sito occorre collegarsi all’indirizzohttp://www.weather.com/services/xmloap.html, per ottenere lachiave di licenza (License key) ed un identificativo (partner id). Oltrea questo verrà fornito un link per scaricare il kit di sviluppo che spie-ga il formato XML adottato nonché le icone da utilizzare. Nell’esem-

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 66

Page 69: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 67

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

pio in oggetto le icone, una volta scaricato il kit, sono state salvatenella directory <APP_ROOT>/img, serviranno per mostrare la situa-zione metereologica della zona considerata.

Formato delle richieste e delle risposteA fronte di una richiesta di questo tipo:

http://xoap.weather.com/search/search?where=Pisa

Il servizio risponde con un documento del del tipo:

<?xml version="1.0" encoding="ISO-8859-1"?>

<search ver="2.0">

<loc id="ITXX0059" type="1">Pisa, Italy</loc>

</search>

Effettuando il parsing del documento si ottiene, dal tag id, il codicedella località richiesta. Ottenuto questo occorre effettuare una nuo-va richiesta specificando nei parametri l’identificativo della località,il partner id e la chiave di licenza ottenuti in precedenza. Il formatodella richiesta è il seguente, in grassetto i parametri inseriti.

http://xoap.weather.com/weather/local/ITXX0059

?cc=*&prod=xoap&par=1043388194&key=aee01957b2387dae

Weather.com fornisce la seguente risposta:

<?xml version="1.0" encoding="ISO-8859-1"?>

<weather ver="2.0">

<head>

...

</head>

<loc id="ITXX0059">

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 67

Page 70: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup68

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

<dnam>Pisa, Italy</dnam>

...

</loc>

<cc>

<lsup>7/9/07 12:45 PM Local Time</lsup>

<obst>Pisa, Italy</obst>

<tmp>81</tmp>

<flik>81</flik>

<t>Partly Cloudy</t>

<icon>30</icon>

<bar>

<r>29.91</r>

<d>steady</d>

</bar>

<wind>

<s>7</s>

<gust>N/A</gust>

<d>240</d>

<t>WSW</t>

</wind>

<hmid>48</hmid>

<vis>6.2</vis>

<uv>

<i>N/A</i>

<t>N/A</t>

</uv>

<dewp>59</dewp>

<moon>

<icon>24</icon>

<t>Waning Crescent</t>

</moon>

</cc>

</weather>

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 68

Page 71: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 69

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

Come si vede la risposta è piuttosto articolata, sono ritornate una mol-teplicità di informazioni quali la temperatura, la pressione, il vento,la fase lunare ecc... In particolare utilizzeremo la temperatura (espres-sa in gradi farenheit) e l’icona da utilizzare. Nell’esempio l’icona dautilizzare è la n.30, che andrà reperita con il cammino<APP:_ROOT>/img/30.png.

La funzione implementataLa funzione che utilizza il servizio weather.com riceve come para-metro l’oggetto infopoint ottenuto col geocoding e ritorna il codiceHTML per la visualizzazione delle caratteristiche meteo.

function infoMeteo($citta)

{

// Creazione oggetto CURL

$curl_obj = curl_init();

curl_setopt($curl_obj, CURLOPT_HEADER, 0);

curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, 1);

// Carica la chiave weather.com salvata nel file weatherKey.txt

$fh = fopen("weatherKey.txt", "r");

if (!$fh) die("Errore: Chiave weather.com assente");

$weather_key = fread($fh, filesize("weatherKey.txt"));

fclose($fh);

// Carica il partner id salvata nel file weatherPID.txt

$fh = fopen("weatherPID.txt", "r");

if (!$fh) die("Errore: Partner id weather.com assente");

$weather_pid = fread($fh, filesize("weatherPID.txt"));

fclose($fh);

// Preparazione della stringa di richiesta

$url = “http://xoap.weather.com/search/search?where=”.$citta;

// Effettua la query a weather

curl_setopt($curl_obj, CURLOPT_URL, $url);

$weather_response = curl_exrc($curl_obj);

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 69

Page 72: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup70

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

// Parsing della risposta

$weather_result = simplexml_load_string($weather_response);

$city_id = $weather_result->search->loc->attributes[“id”];

$html_code=””;

if (!$city_id)

{

echo(“Impossibile soddisfare richiesta per questa località”;

}

else

{

// Effettua la richiesta meteo

$url = “http://xoap.weather.com/weather/local/”;

$url .= $city_id.”?cc=*prod=xoap”;

$url .= “&par=”.$weather_pid;

$url .= &key=”.$weather_key;

curl_setopt($curl_obj, CURLOPT_URL, $url);

$weather_response = curl_exrc($curl_obj);

$weather_result = simplexml_load_string($weather_response);

$icon = $weather_result->weather->cc->icon;

$temp = $weather_result->weather->cc->tmp;

$html_code=”<img src=\”images/”.$icon.”.png\”/><br/>”;

$html_code=”Temperatura:”.$temp;

}

curl_close($curl_object);

return $html_code;

}

La pagina principale richiamerà quindi inizialmente la funzione

$info = infoAddress($postal_address);

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 70

Page 73: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 71

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

Passerà poi l’attributo città dell’oggetto ottenuto alla funzione info-Meteo

$citta =$info->citta;

$html_temp= infoMeteo($citta);

A questo punto visualizzerà la mappa di Google centrata sulle coo-dinate fornite da infoAddress e inserirà il codice HTML riguardantela temperatura.

MASHUP IN JAVA: CHE TEMPO FA?Potrebbe essere interessante permettere all’utente di cliccare unpunto qualsiasi di una mappa (anche in questo caso realizzata conGoogle Maps) e fornire le indicazioni meteorologiche (presenti e, sepossibile, future) per quella determinata zona. Una veloce ricercacon Google permette di identificare alcuni possibili servizi che forni-scono informazioni meteorologiche potrebbe essere riusato, ancheper questo esempio, http://www.weather.com. Però si ricercheranno,a titolo di esempio, ulteriori alternative. Un’altra fonte di servizi, tra

Figura 5.1: L’esempio completo in PHP.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 71

Page 74: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup72

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

cui anche altri diversi da quelli ricercati, è Strike Ironhttp://www.strikeiron.com/ (in particolare si veda il serviziohttp://www.strikeiron.com/ProductDetail.aspx?p=247, Figura 5.2,il cui WSDL è localizzato all’indirizzo http://ws.strikeiron.com/InnerGears/WeatherByCity2?WSDL). Nulla di gratuito? Forse…

Weather.orgParticolarmente interessante il sito del NOAA (National Oceanic andAtmospheric Administration), agenzia americana che tra i vari servi-zi offre informazioni meteorologiche sul sito http://www.weather.gov/(Figura 5.3) in maniera gratuita. L’unico inconveniente è che copreunicamente gli Stati Uniti d’Amarica.Tra gli altri servizi offre la possibilità di recuperare informazioni me-teorologiche in base alle coordinate (longitudine e latitudine) for-nite. L’url da invocare è la seguente:

Figura 5.2: Il servizio (commerciale) fornito da StrikeIron per il tempo

meteorologico.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 72

Page 75: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

73

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

http://www.weather.gov/forecasts/xml/OGC_services/ndfdOWSserver.phpI parametri da passare, sempre alla url come query string, sono elen-cati in Tabella 5.1.

Figura 5.3: Il sito http://www.weather.gov/, con numerose informazioni e

statistiche meteorologiche..

Parametro Valore usato Significato

SERVICERequestVersion

TYPENAMEtime

ELEMENTS

latLonList

WFSGetFeature1.0.0

Forecast_Gml2Point(data attuale)

maxt,wspd,wdir,rhm,waveh,wx,mint,icons,temp,sky,td,apt,qpf,snow,wgust,pop12

LONG,LAT

Nome del servizio richiestoTipo di richiestaTipo di risultato (diverse versioniproducono XML differenti)

Tempo (in formato AAAA-MM-GGThh:mm:ss) di cui si vuole lasituazione meteorologicaQuali elementi includere nei risultati(ciascun elemento identifica unamisurazione; maxt è la temperaturamassima, icons è l’icona che illustra lasituazione meteorologica e così via).Longitudine e latitudine del punto dicui si desiderano le informazioni

Tabella 5.1: Parametri del servizio weather.org

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 73

Page 76: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup74

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Un esempio potrebbe essere la seguente URL:

http://www.weather.gov/forecasts/xml/OGC_services/ndfdOWSserver.php?SERVICE=WFS&Request=GetFeature&VERSION=1.0.0&TYPENAME=Forecast_Gml2Point&latLonList=43.70,-102.65&time=2007-06-25T23:00:00. La risposta è un documento XML così formato:

<?xml version="1.0" encoding="UTF-8"?>

<app:NdfdForecastCollection

xmlns="http://www.weather.gov/forecasts/xml/OGC_services"

xmlns:app="http://www.weather.gov/forecasts/xml/OGC_services"

xmlns:ows="http://www.opengis.net/ows"

xmlns:ogc="http://www.opengis.net/ogc"

xmlns:wfs="http://www.opengis.net/wfs"

xmlns:gml="http://www.opengis.net/gml"

xmlns:xlink="http://www.w3.org/1999/xlink"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.weather.gov/forecasts/xml/OGC_

services

http://www.weather.gov/forecasts/xml/OGC_services/schema/dwGML_WF

S_GMLv212.xsd ">

<gml:boundedBy>

<gml:Box srsName="EPSG:4326">

<gml:coordinates>-102.65,43.70 -102.65,43.70</gml:coordinates>

</gml:Box>

</gml:boundedBy>

<gml:featureMember>

<app:Forecast_Gml2Point>

<gml:position>

<gml:Point srsName="EPSG:4326">

<gml:coordinates>-102.65,43.70</gml:coordinates>

</gml:Point>

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 74

Page 77: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 75

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

</gml:position>

<app:validTime>2007-06-25T23:00:00</app:validTime>

<app:maximumTemperature>101</app:maximumTemperature>

<app:minimumTemperature>60</app:minimumTemperature>

<app:temperature>98</app:temperature>

<app:dewpointTemperature>53</app:dewpointTemperature>

<app:apparentTemperature>95</app:apparentTemperature>

<app:rainAmount6Hourly>0.00</app:rainAmount6Hourly>

<app:snowAmount6Hourly>0</app:snowAmount6Hourly>

<app:probOfPrecip12hourly>13</app:probOfPrecip12hourly>

<app:windSpeed>7</app:windSpeed>

<app:windGust>8</app:windGust>

<app:windDirection>257</app:windDirection>

<app:skyCover>38</app:skyCover>

<app:relativeHumidity>23</app:relativeHumidity>

<app:waveHeight>9999</app:waveHeight>

<app:weatherCoverage>none</app:weatherCoverage>

<app:weatherIntensity>none</app:weatherIntensity>

<app:weatherType>none</app:weatherType>

<app:weatherQualifier>none</app:weatherQualifier>

<app:weatherVisibility>none</app:weatherVisibility>

<app:weatherIcon>http://www.nws.noaa.gov/weather/images/fcicons/hot.

jpg</app:weatherIcon>

</app:Forecast_Gml2Point>

</gml:featureMember>

</app:NdfdForecastCollection>

Utilizzeremo questo servizio per il nostro mashup di esempio.

Invocazione e uso del servizioLa classe che si occupa di gestire le invocazioni al servizio è Filtro-SitoWeatherOrg.java. Tra le altre cose essa si occupa anche del par-sing del documento XML restituito. Per comodità implementativa

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 75

Page 78: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup76

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

questa classe non restituisce una classe JavaBean con i valori desi-derati, ma una hashtable (chiave/valore). La classe dichiara alcunecostanti (endpoint del servizio e valori di invocazione fissi) e identi-fica in tagsWeather tutti i tag di interesse (di cui cioè si reperisce ilvalore):

public static final String[] tagsWeather = {

"temperature", "weatherIcon", "maximumTemperature",

"minimumTemperature", "rainAmount6Hourly", "snowAmount6Hourly",

"probOfPrecip12hourly", "skyCover" , "relativeHumidity",

"windSpeed"

};

Il metodo principale è prendiCondizioniMeteo che, date longitudinee latitudine, restituisce una Hashtable con tutti i valori reperiti dal ser-vizio remoto:

public static Hashtable prendiCondizioniMeteo(String lat, String lon) {

try{

String urlComp = urlBase+"?"+

paramsBase+

"&latLonList="+lat+","+lon+

"&time="+dateService.format(new java.util.Date())+

"&ELEMENTS=maxt,wspd,wdir,rhm,waveh,wx,mint,"+

"icons,temp,sky,td,apt,qpf,snow,wgust,pop12";

java.net.URL url = new java.net.URL( urlComp );

return prendiAttributi(url.openStream());

}catch(Exception ex){

ex.printStackTrace();

return new java.util.Hashtable();

}

}

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 76

Page 79: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 77

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

Ed ecco il metodo che si preoccupa di fare il parsing del risultato,usando le primitive Java per la gestione di documenti XML:

public static Hashtable prendiAttributi(java.io.InputStream input) {

Hashtable result = new Hashtable ();

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();

Document dom = db.parse(input);

Element docEle = dom.getDocumentElement();

NodeList nl =

docEle.getElementsByTagName("app:Forecast_Gml2Point");

if (nl != null && nl.getLength() > 0) {

for (int i = 0; i < nl.getLength(); i++) {

Element el = (Element) nl.item(i);

for(int ix=0; ix<tagsWeather.length; ix++)

result.put(

tagsWeather[ix],

getValue(el, tagsPrefix+tagsWeather[ix])

);

}

}else

System.out.println("Nessun elemento app:Forecast_Gml2Point!!");

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

Tale parsing consiste nella costruzione del DOM (Document ObjectModel) ovvero di tutta la struttura del docuemnto XML come og-getto in memoria. Questo può essere sensato per messaggi di rispo-sta il cui contenuto è, in fondo, così semplice. Nel caso di documen-

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 77

Page 80: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup78

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

ti molto più lunghi e complessi è preferibile ricorrere a tecnologiealternative, quali SAX e StAX, che evitano di costruire oggetti in me-moria ma funzionano in maniera più snella.

Gestire la mappa sul clientIL client (localizzaClima.jsp) deve far sì che ogni clic dell’utente ven-ga intercettato. Inoltre si deve reperire le coordinate sulla mappaaffinché queste vengano passate al server, il quale restituisce il tem-po atmosferico per il punto di interesse. Per intercettare le coordina-re è necessario creare un opportuno gestore; lo si può fare sul me-todo load() caricato inizialmente:

function load() {

if (GBrowserIsCompatible()) {

map = new GMap2(document.getElementById("map"));

map.addControl(new GSmallMapControl() );

map.setCenter(new GLatLng(39.894,-95.888), 4); // USA

GEvent.addListener(map, "click", function(overlay, latlng){

chiamaServer(latlng);

});

}

}

L’istruzione evidenziata fa sì che al click dell’utente sulla mappa,venga invocata la funzione (anonima) dichiarata come terzo parame-tro; tale funzione non fa altro che invocare chiamaServer a cui vie-ne passato il punto su cui l’utente ha fatto click. Questa funzione

Sul WebPer approfondire le tecnologie di parsing di documenti XML si puòfar riferimento alla pagina http://java.sun.com/webservices/docs/1.6/tu-torial/doc/SJSXP2.html.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 78

Page 81: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 79

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

potrebbe essere scritta come:

function chiamaServer(latlng){

mylat = latlng;

GDownloadUrl(

'proxy.jsp?lat='+latlng.lat()+'&lon='+latlng.lng(),

function(data){

var marker = creaMarker(mylat , data);

map.addOverlay(marker);

marker.openInfoWindowHtml(data);

});

return false;

}

La funzione non fa altro che invocare (via AJAX) proxy.jsp a cui pas-sa le coordinate; al termine del caricamento del risultato viene invo-cata la funzione (anonima) usata come secondo parametro; tale fun-zione riceve come parametro (in questo caso chiamato “data”) ilcontenuto reperito dall’invocazione AJAX; nell’esempio la funzionenon fa altro che aprire un marker con i dati reperiti dal server. Talidati (e lo si capisce guardando al codice di proxy.jsp, disponibile neisorgenti allegati al libro) non sono altro che il codice HTML che va acomporre il contenuto del fumetto, ovvero una tabella HTML dove ogniriga rappresenta un’informazione meteorologica. In Figura 5.4 unesempio di esecuzione.Ovviamente i dati restituiti dal server possono essere in diversiformati; nell’esempio appena visto essi non sono altro che infor-mazioni HTML da mostrare; altre volte potrebbero essere documen-ti XML (è il caso in cui il client potrebbe desiderare di farci il par-sing per reperire alcune delle tante informazioni restituite), altrevolte potrebbero essere oggetti e/o array JavaScript, restituiti se-condo l’usuale formato JSON. Un esempio verrà mostrato nellaprossima applicazione…

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 79

Page 82: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup80

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

CALENDARI E PERCORSI, TUTTO CON GOOGLE!Google, tra le numerose applicazioni fornite, permette di tener trac-cia dei propri appuntamenti usando una rubrica in rete. Tale applica-zione si chiama Google Calendar ed è, come molte altre, completa-mente gratuita e accessibile in seguito ad una registrazione (si vedahttp://www.google.com/calendar/).

Inserire gli eventiAll’interno del proprio calendario (che, tra le altre cose, può esse-re visualizzato secondo molteplici viste: da quella giornaliera, a set-timanale o mensile) è possibile inserire degli eventi. Un eventosi caratterizza per titolo, giorno (compreso l’orario), la possibilitàche sia ciclico (ovvero che si ripete nel tempo), una località e unadescrizione; il tutto è gestito con una semplice interfaccia Webche si basa su AJAX. In particolare, per inserire un evento, è pos-

Figura 5.4: L’applicazione di esempio che mostra il tempo meteorologico

sul punto della mappa in cui l’utente ha fatto clic.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 80

Page 83: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 81

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

sibile fare clic su un punto qualsiasi del calendario e si apre un fu-metto in cui l’intervallo temporale è quello dove si è fatto clic più1 ora; inoltre viene chie

Se, invece, si desidera inserire tutti i dettagli dell’evento, è neces-sario fare clic sul link “Modifica dettagli evento” o, in alternati-va, fare clic su un evento già inserito; in entrambi i casi è possi-bile accedere a tutti i dettagli e valorizzarli (Figura 5.6). Per i no-stri esempi è importante che il luogo dell’evento (campo “dove”)possieda un indirizzo valido. Un evento può essere eliminato edi-tandolo e poi facendo clic sul pulsante “Elimina” (pulsantiera inalto).In Figura 5.7 tutti i dettagli di una ipotetica visita della Toscana di cin-que giorni, che tocca Pisa, Lari, San Gimignano, Monteriggioni, Sie-na, Firenze, Pistoia, Lucca e Viareggio…

Figura 5.5: Creazione di un nuovo evento sul calendario con l’interfaccia

semplificata.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 81

Page 84: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup82

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Figura 5.6: Dettagli di un evento.

Figura 5.7: Una ipotetica gita in Toscana di cinque giorni.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 82

Page 85: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 83

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

Accedere agli eventi via APIPer accedere agli eventi del proprio calendario è necessario, per pri-ma cosa, installare le librerie di accesso specifiche per Google Calen-dar; anch’esse sono contenuto nelle librerie GData, accessibili dal-la pagina http://code.google.com/apis/gdata). Per l’esempio che si vuolcreare è necessario permettere l’accesso alle località (indirizzi) me-morizzate per gli eventi in un arco temporale (dalle ore 00:00 di unprimo giorno alle ore 23:59 del secondo giorno specificato; facendocoincidere le due date si ottengono gli appuntamenti di una speci-fica giornata). La classe che implementa questa funzionalità è it.io-programmo.mashup.gdata.Calendar e, in particolare il metodo pren-diEventi, che restituisce un oggetto di tipo EventFeed. Il metodo, do-po essersi autenticato al servizio, imposta una query che permette direstituire tutti gli eventi nell’arco temporale desiderato:

public static EventFeed prendiEventi(Date daData, Date aData){

GoogleService myService = accediServizio();

URL feedUrl = new URL(

"http://www.google.com/calendar/feeds/"+

gestChiavi.getValue("google-email")+"/private/full");

CalendarQuery myQuery = new CalendarQuery(feedUrl);

String str_inizio = DateManager.getDateJDBC(daData);

String str_fine = DateManager.getDateJDBC(aData);

myQuery.setMinimumStartTime(

DateTime.parseDateTime(str_inizio+"T00:00:00"));

myQuery.setMaximumStartTime(

DateTime.parseDateTime(str_fine+"T23:59:59"));

myQuery.addCustomParameter(

new Query.CustomParameter( "orderby", "starttime"));

myQuery.addCustomParameter(

new Query.CustomParameter( "sortorder", "ascending"));

myQuery.addCustomParameter(

new Query.CustomParameter( "singleevents", "false"));

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 83

Page 86: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup84

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

new EventFeed().declareExtensions(

myService.getExtensionProfile());

EventFeed calFeed = (EventFeed)

myService.query(myQuery, EventFeed.class);

return calFeed;

}

Pubblicare gli indirizzi via JSONLa classe server appena illustrata deve essere acceduta dal Web. Lapagina indirizzi-georeferenziati.jsp legge i parametri dalla request(data inizio e di fine), usa la classe precedente per reperire tutti glieventi e, quello che deve fare, è reperire le località memorizzate in cia-scun evento e inviarle alla pagina che userà gli indirizzi per disegna-re una mappa; per comodità si invia la lista degli indirizzi usando lanotazione JSON per la costruzione degli array, ovvero:

[ 'Elemento1', 'Elemento 2', …, 'Elemento N']

Ma andiamo con ordine; la JSP deve dapprima leggere i parametri del-la request e, se questi sono nulli o vuoti, impostarli con la data delsistema:

<%

String dataDaStr = request.getParameter("dataDa");

String dataAStr = request.getParameter("dataA");

java.util.Date dataDa;

java.util.Date dataA;

if (dataDaStr!=null && dataDaStr.length()>0)

dataDa = DateManager.getDateFromIta( dataDaStr );

else

dataDa = new java.util.Date();

if (dataAStr!=null && dataAStr.length()>0)

dataA = DateManager.getDateFromIta( dataAStr );

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 84

Page 87: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 85

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

else

dataA = new java.util.Date();

%>

Usando le due date prende gli eventi dal server:

<%

EventFeed ris = Calendar.prendiEventi(dataDa, dataA);

%>

Non resta che scorrerli e comporre, su una variabile temporaneachiamata wString, il risultato e, in particolare, gli oggetti di tipo Even-tEntry acceduti usando ris.getEntries():

<%

String wString = "";

String add = "";

if (ris.getEntries().size() > 0){

java.util.List lLocs = null;

EventEntry calEntry = null;

for (int n = 0; n < ris.getEntries().size(); n++) {

calEntry = (EventEntry) ris.getEntries().get(n);

// accede alle località

}

}

%>

La parte precedentemente indicata con un commento, è la seguen-te, e si occupa di reperire le località (getLocations) e, iterando su diesse, accedere agli oggetti di tipo Where da cui ricavare il testo:

lLocs = calEntry.getLocations();

for (Iterator iterator1 = lLocs.iterator(); iterator1.hasNext();) {

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 85

Page 88: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup86

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Where where = (Where) iterator1.next();

wString = wString + add + "'"+where.getValueString()+"'";

add = ", ";

}

Infine la JSP fa il seguente output:

[<%= wString %>]

Ovvero mette in formato JSON gli indirizzi reperiti (o stringa vuota se nonce ne sono). Di seguito la pagina che legge il risultato e lo mostra su unamappa, dopo aver georeferenziato gli indirizzi recuperati…

Mappa e georeferenziazioneLa pagina che conclude l’applicazione è calendarioSuMappaConDirezioni.jsp. Tale pagina dovrà sicuramente contenere una formcon due campi di inserimento testo: uno per ogni data (inizio e finedel periodo su cui interrogare il calendario); inoltre ci sarà un pulsan-te per “comandare” l’aggiornamento della mappa:

<form action="#">

<input type="text" name="dataDa"

value="<%= DateManager.getDateIta(new java.util.Date()) %>" />

<input type="text" name="dataA"

value="<%= DateManager.getDateIta(new java.util.Date()) %>" />

<input type="button" name="percorso" value="Percorso"

onclick="reloadAll()"/>

</form>

Si noti che alla pressione del pulsante viene invocate la funzione Ja-vaScript reloadAll(); ecco cosa fa:

function reloadAll(){

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 86

Page 89: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 87

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

var invoca =

"indirizzi-georeferenziati.jsp?dataDa="+

document.forms[0].dataDa.value+

"&dataA="+document.forms[0].dataA.value;

GDownloadUrl(invoca, function(doc) {

direzioni.loadFromWaypoints(eval(doc));

});

}

In pratica viene costruita un’URL che passa alla pagina indirizzi-geo-referenziati.jsp i due valori inseriti nei campi di inserimento e taleURL viene invocata via AJAX. Il risultato dell’invocazione esegue il me-todo loadFromWaypoints sull’oggetto direzione. Il metodo si preoc-cupa, attraverso una ulteriore chiamata AJAX ai server di Google, digeoreferenziare la lista di indirizzi con cui viene invocato. L’oggetto“direzioni” deve essere così costruito (e inizializzato):

var direzioni;

function load() {

if (GBrowserIsCompatible()) {

// Altre inizializzazioni

direzioni = new GDirections(map);

reloadAll();

}

}

Ovviamente map è, come sempre, una mappa costruita con GoogleMaps. Si noti anche che il metodo reloadAll viene invocato subito(in questo modo all’apertura della pagina vengono mostrate even-tuali località presenti negli eventi del giorno corrente). In Figura 5.8un esempio di esecuzione della pagina.Si noti che per ogni tappa, sulla mappa viene evidenziato un marca-

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 87

Page 90: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup88

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

tore. Facendovi clic appare il dettaglio dell’indirizzo specificato.

La possibilità di visualizzare le località specificate in eventi compresi tradue date potrebbe essere usata per visualizzare anche eventi futuri, co-me può essere l’organizzazione di una vacanza! In Figura 5.9, per esem-pio, una gita in Toscana organizzata usando Google Calendar e il cui iti-nerario è mostrato dall’applicazione appena costruita.

Figura 5.8: L’applicazione visualizza tutte le località specificate in un

determinato giorno.

AttenzioneL’applicazione assume che gli indirizzi immessi siano non ambigui.Un caso di ambiguità è usare solo “Siena” come descrizione delluogo. Per verificarlo, dai dettagli dell’evento, seguire il link “Map-pa”. Google prova a disegnare la mappa corrispondente al luogo e,nel caso di ambiguità (Figura 5.10), specifica, sulla sinistra, le lo-calità che potrebbero essere quelle cercate ma che non riesce a di-stinguerle in automatico. Per evitare si può sia inserire una via (si pro-vi con “Piazza del Campo”) o lo stato (“Italia).

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 88

Page 91: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 89

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

Figura 5.9: Un’ipotetica gita in Toscana mostrata dall’applicazione.

Figura 5.10: “Siena” risulta un indirizzo ambiguo.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 89

Page 92: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5

I libri di ioPROGRAMMO/Lavorare con Mashup90

Mappe con il meteo e GeocodingLAVORARE CON

MASHUP

Tempi di rispostaL’applicazione appena realizzata mette in evidenza possibili lentez-ze nel visualizzare le mappe. Il motivo è presto detto: prima di vi-sualizzare la mappa (che comunque comporta una chiamata AJAX alserver di Google!) il server deve reperire i dati da Google Calendar,pertanto deve attendere la risposta del server remoto. I dati vengo-no comunicati al client il quale, a sua volta, usa la georeferenziazio-ne di Google usando, ancora una volta, un’invocazione AJAX al ser-ver di Google. Tutto questo porta a tempi non certo brevi e, cosa an-cor più importante, in presenza di numerosi visitatori può rivelarsiun appesantimento del sistema e del consumo di risorse. Per evitar-lo si potrebbe fare delle operazioni di cache locali. In particolare il ser-ver potrebbe, di tanto in tanto, interrogare Google Calendar e aggior-nare la propria copia locale. In tale circostanza potrebbe ricorrerealla georeferenziazione (pertanto una volta per tutte, in quanto an-che tale risultato potrebbe essere messo in cache!). Il client, a que-sto punto, potrebbe limitarsi ad un’unica interazione con il serverlocale.Per applicazioni in ambienti di produzione questo tipo di valutazio-ni è di fondamentale importanza e vanno fatte prima ancora di ren-dere pubblico il servizio.

Aiuto sulle date?L’esempio appena illustrato può essere migliorato anche facendo sìche le date inserite debbano essere valide. Un modo è verificarle do-po l’immissione. Altrimenti è possibile evitare l’inserimento diretto e,grazie a finestre popup html o a contenuto DHTML, proporre un ca-lendario da dove, attraverso una selezione, immettere le date. Oltrea risolvere il problema della correttezza, anche l’interfaccia diventapiù semplice e intuitiva. Lo sviluppo di questi componenti può, comesempre, essere fatta partendo da zero oppure adottare uno o piùcomponeti (ed eventualmente personalizzarlo). Per esempio si vedale pagine http://www.dynarch.com/projects/calendar/ e http://www.ja-

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 90

Page 93: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Mashup 91

Mappe con il meteo e GeocodingCapitolo 5LAVORARE CONMASHUP

vascriptkit.com/script/script2/epoch/index.shtml.

CONCLUSIONIFino ad ora sono state realizzate applicazioni che accedono a dati re-si accessibili in maniera controllata e il loro “consumo”, anche gra-zie a librerie standard, è piuttosto semplice (o comunque semplifica-to).Diverso il caso in cui i dati sono disponibili sul Web senza una pre-cisa volontà di loro fruizione da parte di un agente automatico ester-no. Nel prossimo capitolo verranno analizzati i possibili problemi ealcune soluzioni per aggirarli.

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 91

Page 94: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 5 (061-092):007-050 31-08-2007 17:07 Pagina 92

Page 95: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 93

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

ACCESSO DIRETTO A RISORSE WEB

Come si è avuto modo di accennare in precedenza, quasi tutti i sitiche vogliono condividere le informazioni pubblicate offrono una mo-dalità di accesso ai dati orientata al contenuto. Talvolta così non è.Per esempio ci sono dei siti per cui è possibile utilizzare le informa-zioni reperite, ma che non offrono alcun modo vantaggioso per far-lo. In questi casi l’unica possibilità è accedere alla pagina HTML do-ve compaiono i dati ed estrarre le informazioni. Tale estrazione puòessere fatta con le usuali tecniche generali (accesso alla url e lettu-ra “personalizzata” del contenuto) o grazie ad apposite librerie chesono state pensate per agevolare l’operazione di estrazione.

LIBRERIE JAVA: HTMLPARSERAccedendo alla pagina http://java-source.net/open-source/html-par-sers si ha a disposizione un elenco di alcune librerie (Open Source)per l’estrazione (e talvolta anche per la trasformazione) dei dati dapagine Web. Per estrazione si intende il reperimento delle informa-zioni contenute; per trasformazione si intende una qualche operazio-

AttenzioneÈ necessario prestare attenzione ad eventuali vincoli sull’uso delleinformazioni pubblicate, ancor più quando non sono fornite via API.Un esempio su tutti: si potrebbe pensare di usare il sito www.pagi-nebianche.it per il reperimento (automatico) delle informazioni suinumeri di telefono dei nominativi reperiti da altre parti per creare unnuovo mashup. Questo uso non è consentito, in quanto esplicitamen-te vietato dalla licenza d’uso del sito, consultabile alla paginahttp://www.paginebianche.it/execute.cgi?ts=16&tl=2&cb=&ep=copy-right/tutelacopyright&es=&om=0

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 93

Page 96: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet94

Accesso diretto a risorse WebLAVORARE CON

INTERNET

ne che presenta le informazioni originali ma con struttura e/o presen-tazione diversa. Un caso particolare è la trasformazione di documen-ti HTML non ben formati in documenti ben formati (o addiritturaXHTML valido!). Per i nostri scopi si ignorerà il problema della trasfor-mazione, concentrandoci sul reperimento ed estrazione delle infor-mazioni. In particolare si analizza la libreria “htmlparser”.

Download e licenza d’usoLa pagina principale del progetto è raggiungibile all’indirizzo http://html-parser.sourceforge.net. Il progetto è oltremodo interessante sia perla qualità del frame work proposto che per i notevoli (e semplici)strumenti grafici a corredo.Attualmente la versione disponibile è la 1.6, il cui archivio compres-so (comprensivo di sorgenti, tool di sviluppo e librerie) è di circa 4 Mb.La licenza d’uso è la LGPL (pertanto è possibile usare la libreria an-che all’interno di prodotti commerciali senza l’obbligo di rendereOpen Source anch’essi!).Una volta scompattato il file compresso si ha a disposizione unastruttura composta da diverse cartelle; le principali sono:

docs/ : è la prima cartella da usare. Contiene la documentazione es-senziale per partire (si inizia dall’usuale index.html!);bin/ : contiene alcuni esempi e, tra gli altri, il tool filterbuilder, utilis-simo per provare i filtri, creandoli in maniera grafica, per poi far lo-ro generare i sorgenti della classe Java che li realizza;lib/ : le librerie del progetto (da includere nel proprio classpath);

Inoltre è presente il file src.zip, che contiene tutti i file del progettoin formato sorgente (nonché la relativa documentazione in formatoJavaDoc).

Usare filterbuilderUn modo particolarmente semplice per prendere confidenza con le

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 94

Page 97: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 95

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

potenzialità del frame work è quello di invocare lo script bin/filter-builder (usare quello con estensione .cmd se si utilizza un sistemaWin-dows). La sua esecuzione fa sì che venga visualizzata una finestra gra-fica da cui è possibile realizzare (e provare) un qualsiasi filtro perl’estrazione di informazioni da una pagina Web. Come si può osser-vare dalla Figura 5.1, il tool si compone di due colonne; sulla prima(colonna di sinistra) troverà posto la rappresentazione grafica delfiltro realizzato; sulla seconda (a destra) sarà possibile verificare l’e-secuzione del filtro (l’esecuzione si riferisce ad una specifica paginaWeb, il cui indirizzo è quello specificato sulla casella di testo, evi-denziata in figura, in fondo alla finestra). È anche possibile naviga-re la struttura della pagina usando il comando “Operation > FetchPage” (in Figura 6.1 è mostrato il contenuto della paginahttp://www.inea.it/ssa/indfaceco.html, contenente gli indirizzi dellefacoltà di Economia e commercio).

Prima di partire è necessario analizzare la pagina HTML da cui si voglio-

Figura 6.1: la finestra iniziale del tool filterbuilder con il contenuto di una

pagina HTML.

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 95

Page 98: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet96

Accesso diretto a risorse WebLAVORARE CON

INTERNET

no estrarre i dati e ricercare delle modalità di estrazione automatica. Ilframewrok permette di specificare diversi tipi di filtri: si va da filtri chepermettono pattern matching dei valori, a quelli che estraggono solo cer-ti tipi di tag (per esempioTD per una casella all’interno di una tabella) conpossibilità di testare la presenza di attributi particolari (come può esser-lo width o class) aventi anche valori specifici (per esempio 100% su at-tributo width). Se si pensa ai documenti HTML come ad una gerarchia ditag (per esempio si pensi al tag <html> come il padre di tutti gli altri ele-menti, i tag <header> e <body> come a due possibili figli e così via), al-lora si comprende la possibilità offerta dal frame work di applicare uno deifiltri base o al nodo corrente o ad un suo predecessore o successore. Nonsolo: i diversi filtri possono essere composti con le usuali operazioni logi-che (AND; OR e NOT). Per illustrare l’uso di un filtro si pensi al caso in cuisi vogliano estrarre i valori delle facoltà di Economia e commercio dallapagina http://www.inea.it/ssa/indfaceco.html (e, successivamente, dallapagina http://www.inea.it/ssa/indfacagr.html che ha la stessa struttura macon i valori per le facoltà diAgraria). L’analisi delle pagineWeb evidenziacome i valori sono contenuti in una tabella e, precisamente, in tag <td>.Quello che si vuol fare è applicare un opportuno pattern matching ai con-tenuti il cui padre è proprio <td>. Ecco come si può procedere:

1) iniziare inserendo un filtro AND (menu “Filter > AndFilter”);2) selezionato il filtro AND applicare “Filter > HashparentFilter” af-

finché si possa specificare come deve essere fatto il padre;3) inserire un filtro sul tag di tipo TD (“Filter > TagnameFilter”) al-

l’interno di HashparentFilter;4) per l’altro predicando del filtro AND inserire un RegexFilter il cui

valore è “.*”

Eseguendo “Operation > Execute filter” appaiono, per le pagine in-dicate, i contenuti estratti. Ora si vuol rendere persistente questo fil-tro al fine di poterlo utilizzare nelle proprie applicazioni. Scegliere “Fi-le > Save” e specificare il nome e il perscorso dove salvare il filtro (per

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 96

Page 99: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 97

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

esempio dare il nome FiltraIndirizzi.java). In Figura 6.2 il filtro risul-tante, mentre di seguito il codice Java esportato:

public class FiltraIndirizzi

{

public static void main (String args[])

{

TagNameFilter filter0 = new TagNameFilter ();

filter0.setName ("TD");

HasParentFilter filter1 = new HasParentFilter ();

filter1.setRecursive (false);

filter1.setParentFilter (filter0);

RegexFilter filter2 = new RegexFilter ();

filter2.setStrategy (RegexFilter.FIND);

filter2.setPattern (".*");

NodeFilter[] array0 = new NodeFilter[2];

array0[0] = filter1;

array0[1] = filter2;

AndFilter filter3 = new AndFilter ();

filter3.setPredicates (array0);

NodeFilter[] array1 = new NodeFilter[1];

array1[0] = filter3;

FilterBean bean = new FilterBean ();

bean.setFilters (array1);

if (0 != args.length)

{

bean.setURL (args[0]);

System.out.println (bean.getNodes ().toHtml ());

}

else

System.out.println (

"Usage: java -classpath .:htmlparser.jar FiltraIndirizzi <url>");

}

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 97

Page 100: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet98

Accesso diretto a risorse WebLAVORARE CON

INTERNET

}

Tale codice può essere anche modificato e adattato per ulteriori e fu-ture esigenze.Sulla falsariga di quanto illustrato realizziamo un nuovo mashup…

MASHUP USANDO IL FORUMDI IOPROGRAMMOAccedendo alla pagina http://forum.ioprogrammo.it/members.php?mo-de=view&boardid=0&by=userposts (Figura 6.3) è possibile conosce-re gli utenti che hanno fatto più post all’interno dei forum della ri-vista IoProgrammo.Alcuni utenti hanno segnalato anche la propriapagina personale. Potrebbe essere interessante realizzare un ma-shup che legge la pagina, prende tutte le pagine Web degli utenti conpiù post e pubblichi una lista dove c’è uno screenshot della home pa-ge e un link verso di essa.

Figura 6.2: Il filtro risultante per il parsing degli indirizzi.

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 98

Page 101: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 99

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

Screenshot “dinamici”? WebThumb!Un servizio che permette, dato un indirizzo di pagina Web, di averneuno screenshot è quello accessibile alla pagina http://bluga.net/webthumb/.Nella forma base (250 richieste di screenshot, o thumbnails, al mese) ilservizio è gratuito, previa registrazione. La registrazione è pressochéimmediata ed è importante copiare la chiave e farla accedere alla pro-pria applicazione affinché si possano eseguire le richieste.Tali richiestepossono essere fatte dal sitoWeb ma, cosa interessante per il nostro con-testo, anche attraverso invocazioni di tipo REST. L’url da invocare è:http://webthumb.bluga.net/api.phpA tale URL vanno inviati opportuni messaggi XML che fungono da co-mandi. Il comando base è così formato:

<webthumb>

<apikey>key ottenuta dalla registrazione</apikey>

<!—

qui vanno altri parametric

Figura 6.3: la pagina dove estrarre i dati.

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 99

Page 102: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet100

Accesso diretto a risorse WebLAVORARE CON

INTERNET

specifici per i diversi comandi

-->

</webthumb>

I parametri specifici (che vanno inseriti al posto del commento del co-mando base) possono essere quelli elencati nel seguito. Si vedran-no anche i dettagli della classe Java it.ioprogrammo.mashup.Gesto-reWebThumb; essa implementa l’interfaccia verso il servizio.

Nuova thumbnailEcco come deve essere composto il comando “request”, usato perrichiedere la generazione di una nuova thumbnail

<request>

<url>ivenuti.altervista.org</url>

</request>

Il comando può avere (opzionalmente) specificate le dimensioni concui viene aperta la pagina (in pratica è la dimensione della finestradel browser da cui fare lo screenshot):

<request>

<url>ivenuti.altervista.org</url>

<width>800</width>

<height>600</height>

</request>

All’interno di una singola chiamata possono essere elencate più ri-chieste. Per semplicità le classi Java che realizzano le richieste ac-cettano una sola URL per chiamata; ecco il metodo che la gestisce:

public String nuovaRichiesta(String weburl){

weburl = normalize(weburl);

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 100

Page 103: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 101

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

String tmp;

if ((tmp=p.getProperty(weburl))!=null)

return tmp;

String str = "<webthumb><apikey>"+apikey+"</apikey>"+

"<request><url>"+weburl+"</url>"+

"</request></webthumb>";

try {

String key = parsingRisposta(

sendCommand(str)

);

if (key!=null)

p.setProperty(weburl, key);

} catch (Exception e) {

e.printStackTrace();

}

return tmp;

}

Il “cuore”della funzione è rappresentato dal testo evidenziato: sendCom-mand è un metodo che, per comodità, realizza l’invocazione all’URL re-mota e si preoccupa di aprire lo stream per leggere la risposta:

public java.io.InputStream sendCommand(String command){

try {

URL url = new URL(urlService);

URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();

os.write(command.getBytes());

os.close();

if (conn.getContentType().equals(CONTENT_TYPE_ERRORE)){

this.dump(conn.getInputStream(),

new BufferedOutputStream(System.err));

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 101

Page 104: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet102

Accesso diretto a risorse WebLAVORARE CON

INTERNET

return errorFile();

}

return conn.getInputStream();

} catch (Exception e) {

return errorFile();

}

}

Si noti come il metodo verifica se c’è stato un errore in base al tipo dirisposta (ovvero al suo content-type). In caso di errore viene comun-que inviata un’immagine, ma si tratta di una immagine locale con unascritta di errore. Il metodo dump è un metodo (pubblico, affinché pos-sa essere usato anche da classi esterne!) che esegue un semplice “tra-vaso” di byte tra lo stream di output a quello di input.La risposta ottenuta viene analizzata dal metodo parsingRisposta. Pereseguire il parsing è necessario comprendere come questa viene gene-rata; una nuova richiesta, se soddisfatta, ottiene in risposta del codiceXML al cui interno c’è un codice che d’ora in poi dovrà essere usato peridentificare univocamente la thumbnail ed è contenuto come valore diun tag <job>:

<webthumb>

<jobs>

<job estimate='20' time='2007-08-30 08:49:45'

url='http://ivenuti.altervista.org'>wt4680b94abdf30</job>

</jobs>

</webthumb>

In questo caso la chiave da associare all’url è il testo evidenziato:wt4680b94abdf30.

Lo stato di una richiestaUna limitazione, se così si può dire, del servizio è quella che la thumb-

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 102

Page 105: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 103

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

nail non è disponibile subito, ma dopo un periodo di tempo; in alcu-ni casi potrebbe essere utile utilizzare la stima o procedere alla ve-rifica dello stato inserendo, nel comando base, la seguente richie-sta:

<status>

<job>wt4680b94abdf30</job>

</status>

Nell’implementazione Java verrà ignorato lo stato; in presenza dierrori sarà mostrata un’immagine di errore predefinita.

Reperire l’immagineInfine ecco il metodo che, data la chiave, ne reperisce l’immagine(in un formato specificato come parametro); il comando inviato èevidenziato in grassetto:

public java.io.InputStream getKeyThumb(String key, String size){

String cmd =

"<webthumb>"+

"<apikey>"+apikey+"</apikey>"+

"<fetch>"+

"<job>"+key+"</job>"+

"<size>"+size+"</size>"+

"</fetch>"+

"</webthumb>";

try {

return sendCommand(cmd);

} catch (Exception e) {

return errorFile();

}

}

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 103

Page 106: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet104

Accesso diretto a risorse WebLAVORARE CON

INTERNET

Recuperare i siti Web degli utentiL’esempio che si vuol realizzare implica che si esegua il parsing della pa-gina e, ottenuti gli indirizzi delle pagine personali, si usi la classe appenacreata per la generazione delle thumbnail. Il parsing verrà fatto con HTMLParser (in particolare con htmlbuilder, come mostrato in Figura 6.4).

Il codice Java, dopo essere stato esportato, può essere personalizza-to; ecco il metodo re ingegnerizzato risultante (classe it.ioprogrammo.ma-shup.htmlparser.FiltraPostEdizioniMaster):

public static String[] getUrlMaggioriPost(String url){

if (url==null)

url = defaultUrl;

HasAttributeFilter filter0 = new HasAttributeFilter ();

filter0.setAttributeName ("src");

filter0.setAttributeValue ("images/style/www.gif");

Figura 6.4: Il filtro per reperire le home page degli utenti.

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 104

Page 107: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 105

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

TagNameFilter filter1 = new TagNameFilter ();

filter1.setName ("IMG");

NodeFilter[] array0 = new NodeFilter[2];

array0[0] = filter0;

array0[1] = filter1;

AndFilter filter2 = new AndFilter ();

filter2.setPredicates (array0);

HasChildFilter filter3 = new HasChildFilter ();

filter3.setRecursive (false);

filter3.setChildFilter (filter2);

HasAttributeFilter filter4 = new HasAttributeFilter ();

filter4.setAttributeName ("target");

filter4.setAttributeValue ("_blank");

TagNameFilter filter5 = new TagNameFilter ();

filter5.setName ("A");

NodeFilter[] array1 = new NodeFilter[2];

array1[0] = filter4;

array1[1] = filter5;

AndFilter filter6 = new AndFilter ();

filter6.setPredicates (array1);

NodeFilter[] array2 = new NodeFilter[2];

array2[0] = filter3;

array2[1] = filter6;

AndFilter filter7 = new AndFilter ();

filter7.setPredicates (array2);

NodeFilter[] array3 = new NodeFilter[1];

array3[0] = filter7;

FilterBean bean = new FilterBean ();

bean.setFilters (array3);

bean.setURL (url);

String[] ris = new String[bean.getNodes().size()];

for(int i=0; i<bean.getNodes().size(); i++){

String tmp = bean.getNodes().elementAt(i).getText();

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 105

Page 108: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet106

Accesso diretto a risorse WebLAVORARE CON

INTERNET

int primo = tmp.indexOf("\"");

ris[i] = tmp.substring(primo+1,

primo+tmp.substring(primo+1).indexOf("\"")+1);

}

return ris;

}

Mostrare le immaginiUn’immagine, una volta reperita dal server remoto, deve essere mo-strata al client. Un modo è quella di salvarla in locale; altro modo(utile però solo per questo esempio, perché, come si è già avuto mo-do di dire, è sempre meglio eseguire il cache dei risultati!) è quellodi passare direttamente lo stream di output del server remoto alclient che ha fatto la richiesta. Ecco la servlet che realizza una simi-le funzionalità:

public class GetImageServlet extends HttpServlet {

public static final String KEY = "key";

public static final String SIZE = "size";

protected void doGet(

HttpServletRequest request, HttpServletResponse response){

String src = request.getParameter(KEY);

String size = request.getParameter(SIZE);

if (size == null){

size = GestoreWebThumb.SIZE_SMALL;

}

GestoreWebThumb thumb = GestoreWebThumb.getInstance();

response.setContentType("image/jpeg");

try {

java.io.InputStream is

= thumb.getKeyThumb(src, size);

thumb.dump(is, response.getOutputStream() );

is.close();

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 106

Page 109: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 107

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

response.flushBuffer();

} catch (Exception e) {

e.printStackTrace();

}

}

Anche in questo casi si fa uso del metodo dump per l’invio dei dati.È importante osservare come la servlet specifichi correttamente ilcontent type nella risposta http al client.Tra i parametri letti ci sonosia la chiave da cui ricavare l’immagine, sia il suo formato (se que-st’ultimo parametro è assente, si esegue il download dell’immaginenel formato più piccolo).

La pagina di visualizzazioneEcco come si potrebbe realizzare la JSP per la visualizzazione dellethumbnail. Per esempio si potrebbe mostrare il primo sito Web (quel-lo che si riferisce all’utente con più post) in formato medio/grande:

<%

GestoreWebThumb gestore = GestoreWebThumb.getInstance();

String[] qualiUrl = FiltraPostEdizioniMaster.getUrlMaggioriPost(null);

%>

<tr><td colspan="<%= numeroColonne %>">

<a href="<%= qualiUrl[0] %>" target="_blank"

><img

src="./servlet/image/download.jpg?size=<%= GestoreWebThumb.SIZE

_MEDIUM_LARGE %>&key=<%= gestore.nuovaRichiesta( qualiUrl[0] ) %

>"

alt="<%= qualiUrl[0] %>"

title="<%= qualiUrl[0] %>"

<%= GestoreWebThumb.xy_SIZE_MEDIUM_LARGE %> /></a>

</td></tr>

<tr>

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 107

Page 110: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet108

Accesso diretto a risorse WebLAVORARE CON

INTERNET

Si noti come la sorgente dell’immagine è una url a cui risponde la serv-let descritta in precedenza. Non resta che stampare tutti gli altri sitiWebreperiti (stavolta in formato medio suddivise per tre thumbnail per riga):

<%

int numeroColonne = 3;

int i=0;

for(i=1; i<qualiUrl.length; i++){

%>

<td>

<a href="<%= qualiUrl[i] %>" target="_blank"

><img

src="./servlet/image/download.jpg?size=<%= GestoreWebThumb.SIZE

_MEDIUM %>&key=<%= gestore.nuovaRichiesta( qualiUrl[i] ) %>"

alt="<%= qualiUrl[i] %>"

title="<%= qualiUrl[i] %>"

<%= GestoreWebThumb.xy_SIZE_MEDIUM %> /></a>

</td>

<%

if(i%numeroColonne==0){

%>

</tr>

<tr>

<%

}

}

</tr>

</table>

Migliorare il risultatoLa prima invocazione alla JSP di visualizzazione può essere una pa-gina piena di errori (Figura 6.5). Questo perché la cattura delle thumb-nail non è immediata ma necessita di un po’ di tempo. -

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 108

Page 111: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 109

Accesso diretto a risorse WebCapitolo 6LAVORARE CONINTERNET

Una possibile (semplice) soluzione consiste nel richiedere la genera-zione delle thumbnail allo startup della webapp. Infatti è probabileche gli utenti con più post siano stabili nel breve periodo, rendendorare eventuali nuove richieste (e in tal caso è accettabile un errore mo-mentaneo). Ecco come si può realizzare una servlet che esegue ta-le inizializzazione:

public class StartupServlet extends HttpServlet {

public void init(ServletConfig config) throws ServletException {

GestoreWebThumb.getInstance().setApikey( chiave);

FiltraPostEdizioniMaster.loadAndStoreNewMembers();

}

// altro

}

è importante che il file /WEB-INF/web.xml contenga l’attributoload-on-startup per tale servlet:

<servlet>

Figura 6.5: Solo errori? Il server sta prendendo le thumbnail!

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 109

Page 112: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 6

I libri di ioPROGRAMMO/Lavorare con Internet110

Accesso diretto a risorse WebLAVORARE CON

INTERNET

<servlet-name>initServlet</servlet-name>

<servlet-class>

it.ioprogrammo.mashup.servlet.StartupServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

Che accade per le nuove immagini generate durante l’esecuzione? Que-ste vengono memorizzate in una struttura in memoria; per renderle per-sistenti vanno salvate. Un modo è quello di salvare la struttura ogni vol-ta che questa viene aggiornata.Altrimenti si potrebbe implementare ilmetodo destroy() che viene invocato quando la webapp viene fermata(sia perché viene fermato il Servlet Container, sia per eventuali nuovideploy o riavvie del contesto):

public void destroy(){

GestoreWebThumb.getInstance().storeKeys();

}

Il risultato complessivo? In Figura 6.6 fa bella mostra si sé!

Figura 6.6: L’applicazione finale

Capitolo 6 (093-110):007-050 31-08-2007 17:11 Pagina 110

Page 113: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 111

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

ALTRI MASHUP IN PHP

UN AGGREGATORE DI FEEDS RSS PER YOUTUBEYouTube è essenzialmente un servizio che permette di mostrare i vi-deo. La sua enorme popolarità è dovuta al fatto che permette l'uploaddi video creati da chiunque. Ospita quindi materiale delle più dispa-rate provenienze che non sia coperto da diritti.Anche YouTube, al pa-ri di Google, ha sviluppato delle API tramite le quali è possibile ac-cedere all’insieme dei suoi video.

Dal sito YouTube:“YouTube offre il completo accesso alle parti prin-cipali della sua raccolta di video e alla sua community medianteun'interfaccia API aperta e feed RSS. Con l'utilizzo delle nostre API,puoi facilmente integrare nella tua applicazione dei video online dal-la raccolta di video di YouTube, che cresce ogni giorno di più. Unavolta creato un profilo sviluppatore, sei pronto a sfruttare al massi-mo le potenzialità di YouTube.”

L’esempio descritto in questo capitolo consiste in un tool che per-mette l’estrazione di feed dal sito YouTube, ne effettua il parsing e vi-sualizza i contenuti ottenuti in base alle preferenze dell'utente. Tut-ta la logica viene racchiusa in una classe PHP di facile utilizzo.

Ottenere un developer IDAnche YouTube richiede una chiave per utilizzare le sue API; talechiave viene, in genere, chiamata developer id. Per ottenerla occor-re creare un account su YouTube e, successivamente, effettuare lalogin e connettersi alla pagina http://www.youtube.com/my_profile_dev.Una volta compilata la form in figura 7.1 si ottiene il developer id (va-lido per il dominio immesso) che permette l’accesso alle API.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 111

Page 114: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet112

Altri Mashup in PHPLAVORARE CON

INTERNET

Cosa sono i feed RSSPrima di iniziare lo sviluppo dell’esempio occorre descrivere brevementeil significato di feed RSS (Really Simple Syndication). In estrema sintesipossiamo dire che si tratta di un formato basato su XML il cui scopo è ladiffusione di contenuti. Un utente, iscrivendosi ai feed RSS di un sito (me-glio: di una fonte di contenuti online), ha la possibilità di ricevere in au-tomatico informazioni aggiornate e personalizzate senza dover effettua-re periodici controlli del sito in questione per ottenere eventuali aggior-namenti. L’applicazione descritta nel presente capitolo si occupa di estrar-re documenti RSS dal sito YouTube, di effettuarne il parsing (individuan-do e decodificando i diversi elementi del documento XML) per poi conver-tire i contenuti decodificati in formato HTML. In questo modo sarà possi-bile incorporare i contenuti desiderati diYouTube all’interno di un qualsia-si sito.

Feed RSS di YouTube: per tag e per utentiYouTube offre diversi feed RSS, ognuno per gruppi di video suddivi-si per categorie: i video più visti, i video caricati di recente, i video ilcui titolo contiene una certa parola, ecc...I feed sono personalizzati

Figura 7.1: Developer id fornito da YouTube.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 112

Page 115: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 113

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

per utenti e per tag.La richiesta di una lista di video associati ad unutente ha il seguente formato:

http://www.youtube.com/api2_rest?method=youtube.videos.list_by_user

Cui vanno appesi i parametri dev_id e user, rispettivamente la chia-ve fornita da YouTube e l’utente associato ai video scaricabili.Mentre per ottenere una lista di video associati ad un tag occorre com-porre la stringa che segue:

http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag

I parametri sono, in questo caso, dev_id e tag, che identificano lachiave fornita da youtube ed il tag per cui si desidera ottenere la li-sta.

Per esempio, la risposta fornita da youtube per la richiesta http://www.you-tube.com/api2_rest?method=youtube.videos.list_by_tag&dev_id=un-qOBlxyzjA&tag=paintball è un documento in formato XML del tipo:

<?xml version="1.0" encoding="utf-8" ?>

<ut_response status="ok">

<video_list>

<total>23187</total>

<video>

<author>cykovisuals</author>

<id>ddMowxKchko</id>

<title>Paintball Headshot</title>

<length_seconds>33</length_seconds>

<rating_avg>4.81</rating_avg>

<rating_count>3185</rating_count>

<description>Some uncovered kid gets owned by a paintball to the dome.

cykovisuals dot com</description>

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 113

Page 116: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet114

Altri Mashup in PHPLAVORARE CON

INTERNET

<view_count>1097250</view_count>

<upload_time>1165037719</upload_time>

<comment_count>3135</comment_count>

<tags>headshot head shot paintball paint ball airgun tippman angel

spray cykovisuals pbaz</tags>

<url>http://www.youtube.com/?v=ddMowxKchko</url>

<thumbnail_url>http://img.youtube.com/vi/ddMowxKchko/default.jpg

</thumbnail_url>

</video>

...

</video_list>

</ut_response>

Occorre quindi, ancora una volta, effettuare una richiesta HTTP eparserizzare la risposta strutturata per ottenere le informazioni de-siderate. Anche in questo caso ci serviremo del pacchetto CURL pereffettuare la richiesta a YouTube e della libreria SimpleXML per laconvalida e l’estrazione dei dati dalla risposta fornitaci.

UNA FUNZIONEPER LA LETTURA DI FEEDS.Alla base del nostro lettore di feed vi è la funzione getFeed che, sem-pre mediante l’utilizzo del pacchetto CURL, introdotto nel Capitolo2, effettua la richiesta di un feed, in uno dei formati specificati inprecedenza, e restituisce il documento XML di risposta.

function getFeed($feed){

$curl_object = curl_init();

$timeout = 0;

curl_setopt ($object, CURLOPT_URL, $feed);

curl_setopt ($object, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($object, CURLOPT_CONNECTTIMEOUT, $timeout);

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 114

Page 117: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 115

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

$youtube_response = curl_exec($curl_object);

curl_close($ch);

return $youtube_response;

}

La funzione parseYTResp, invece, si occupa del parsing della rispo-sta e della sua trasformazione in formato HTML, in modo da poteressere immediatamente inclusa in una pagina web.

function parseYTResp($youtube_response, $number_of_video){

$yt_result = simplexml_load_string($youtube_response);

/*

Parsing della risposta XML fornita da YuoTube, il risultato è

inserito negli array $url,$thumb_nail,$description, $video

*/

// Effettua un encoding HTML di tutte le descrizioni

for($i=0;$i<count($description[0]);$i++){

$description[0][$i] = preg_replace("/&#60;/","<",$description[0][$i]);

$description[0][$i] = html_entity_decode($description[0][$i],ENT_

QUOTES);

}

// Numero di video ritornati

$total_videos = count($video[0]);

if($number_of_video > $total_videos or $number_of_video == 0){

$number_of_video = $total_videos;

}

//Formattazione HTML

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 115

Page 118: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet116

Altri Mashup in PHPLAVORARE CON

INTERNET

$html_to display = “”;

for($i = 0; $i<$howmany; $i++){

$html_to display .= "<p><a href=\"".$url[0][$i]."\" target=\"_blank\"

><img src=\"".$thumb_nail[0][$i]."\"></a>".$description[0][$i]."</p>";

}

return $html_to_display;

}

Viene effettuato un parsing della risposta XML fornita da YouTube uti-lizzando la libreria SimpleXML. Il risultato è inserito negli array $url,$thumb_nail, $description, $video. Questi sono utilizzati per compor-re la parte HTML da incorporare nella pagina web.Dal frammento dell’esempio di risposta visto in precedenza la fun-zione restituisce il seguente codice HTML:

<p><a href=”http://www.youtube.com/?v=ddMowxKchko" target="

_blank">

<img src=”http://img.youtube.com/vi/ddMowxKchko/default.jpg"></a>

Some uncovered kid gets owned by a paintball to the dome. cykovisuals dot

com </p>

La classe YouTubeFeed contiene tre funzioni principali che utilizza-no le due funzioni appena analizzate

getVideoByFeature($number_of_video);

getVideoByUser($user, $number_of_video);

getVideoByTag($tag, $number_of_video);

Ognuna di queste funzioni utilizza parametri differenti per estrarreuna lista di video utilizzando le API YouTube. Ogni funzione neces-sita del developer_id fornito da YouTube, si ipotizza che sia salvatoall’interno del file YouTubeDevID.txt situato nella stessa directory

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 116

Page 119: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 117

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

del file YouTubeFeed.php contenente il codice in esame.A titolo di esempio ne viene di seguito descritta una. Le altre diffe-riscono solo per il metodo delle API YouTube indicato. Viene com-posta la richiesta per le API YouTube utilizzando il metodovideos.list_by_user; la richiesta è inviata tramite la funzione get-Feed e la risposta viene passata alla funzione

function getVideoByUser ($user, $number_of_video){

// Carica il developer id fornito da YouTube

$fh = fopen("YouTubeDevID.txt", "r");

if (!$fh) die("Errore: YT Developer ID non trovato");

$yt_dev_id = fread($fh, filesize("YouTubeDevID.txt"));

fclose($fh);

// Compone la richiesta per le YuoTube API

$feed = “http://www.youtube.com/api2_rest?”;

$feed .= “method=youtube.videos.list_by_user”;

$feed .= “&dev_id=$yt_dev_id&user=$user";

$yt_response = $this->getFeed($feed);

$html_code = $this->parseYTResp($yt_response, $number_of_video);

return $html_code;

}

La pagina web che utilizza la classe contiene il seguente codice:

$you_tube = new YouTubeFeed;

echo($youtube-> getVideoByFeature(0));

Questo esempio mostra tutti i video estratti dal metodo youtube.videos.li-st_featured delle API di YouTube, mentre gli esempi:

echo($youtube->getVideoByTag(“paintball”, 0));

echo($youtube->getVideoByUser(“cykovisuals”, 0));

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 117

Page 120: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet118

Altri Mashup in PHPLAVORARE CON

INTERNET

Mostrano, rispettivamente, tutti i video estratti dalmetodobyoutube.videos.list_by_tag utilizzando come parametro il tag“paintball” e youtube.videos.list_by_user utilizzando come parametrol’user cykovisuals. Nella figura seguente (Figura 7.2) viene visualizzato ilrisultato delle operazioni descritte all’interno di una pagina HTML.

LAVORARE CON FLICKRFlickr è un servizio, raggiungibile all’URL www.flickr.com , che per-mette all’utente, dopo essersi registrato, di utilizzare le proprie fotoper creare veri e propri cataloghi on-line. Flickr ha acquistato unanotorietà sempre crescente tra gli utenti del web per la molteplicitàe la potenza delle funzioni che offre e, soprattutto, per la facilitàcon cui è possibile accedere a tali funzioni. È possibile, infatti, inse-rire foto e catalogarle per argomento od autore, visualizzarle ed ef-fettuarvi interventi di fotoritocco. Oltre a questo, Flickr mette a di-sposizione degli sviluppatori delle API che forniscono la possibilità diaccedere alle foto e di utilizzarle sul proprio sito webArgomento di questo capitolo saranno proprio queste interfacce; nespiegheremo le modalità di utilizzo tramite due esempi che, utiliz-

Figura 7.2: Come appare l’applicazione

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 118

Page 121: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 119

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

zando funzionalità diverse, illustreranno come mostrare nel propriosito gruppi di immagini provenienti da Flickr. Per poter utilizzare leAPI di Flickr - così come per Google,YouTube ed altri servizi del ge-nere – è necessario procurarsi una Flickr Key, che va richiesta diret-tamente a Flickr. Vediamo di che cosa si tratta e come fare per pro-curarsela.

Ottenere una Flickr API KeyI servizi che Flickr mette a disposizione degli utenti sono gratuiti ma,come accennato poc’anzi, per essere abilitati all’utilizzo delle API, oc-corre essere provvisti di una chiave, comunemente chiamata Flickr APIKey. Si tratta di un codice alfanumerico che identifica univocamente l’u-tilizzatore che andrà ad usufruire dei servizi di Flickr. Ogni qual voltaviene effettuata una chiamata ai metodi di Flickr, questa deve contene-nere, tra gli altri parametri, la chiave di riconoscimento. Per ottenereuna Flickr API Key è necessario creare un account sul sito e, successi-vamente, accedere alla pagina http://www.flickr.com/services/api/keys/ap-ply indicando l’utilizzo che si intende fare dei servizi che Flickr metteràa disposizione.Verrà generata una stringa di lettere e numeri piuttostolunga, che andrà fornita ai servizi Flickr ogni volta che se ne effettueràla chiamata. Insieme alla chiave viene fornito un identificativo segre-to, necessario solamente nel caso si desideri inserire foto in Flickr.An-diamo adesso ad introdurre phpFlickr, uno strumento scritto in PHP, cheutilizzeremo nei nostri esempi e che, come si vedrà, facilita significati-vamente l’utilizzo delle API Flickr.

PHPFlickr, una classeper accedere a FlickrAnalogamente a quanto visto per altre tipologie di interfacce per l’ac-cesso a servizi web, quali Google Maps e YouTube, la risposta che vie-ne fornita è strutturata in un particolare dialetto XML stabilito dal for-nitore del servizio. Una volta effettuata la richiesta, quindi, lo sviluppa-tore deve effettuare il parsing della response XML ed estrarre da essa

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 119

Page 122: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet120

Altri Mashup in PHPLAVORARE CON

INTERNET

le informazioni che intende utilizzare. È, questa, una metodologia spes-so obbligata e che, più volte, è stata utilizzata in questo libro. Per utiliz-zare le API di Flickr si opterà invece per un approccio differente, sfrut-tando un pacchetto free, chiamato PhpFlickr. PhpFlicker è una classe, scrit-ta da Dan Coulter e scaricabile dall’indirizzo http://phpflickr.com, che agi-sce da wrapper nei confronti delle API Flickr. Si occupa di comporre lerichieste, inoltrarle a Flickr e di processare le risposte XML ottenute, ri-tornando i dati in un array manipolabile in maniera facile ed intuitiva.

Installazione di PHPFlickrPer ottenere PhpFlicker è necessario connettersi al sito http://phpflickr.comed effettuare il download del pacchetto.Attenzione: è preferibile scari-care una versione successiva alla 1.3.1 in modo da non dover installa-re anche la libreria PEAR (http://pear.php.net) che PhpFlickr utilizza pereffettuare le connessioni HTTP. Una volta effettuato il download nonresta che copiare i files sotto una directory della propria applicazione.La classe risulterà immediatamente disponibile.

Struttura ed utilizzo di PHPFlickrCome detto inprecedenza PHPFlickr agisce da wrapper nei confrontidelle API di Flickr, rendendole trasparenti all’utilizzatore ed occupan-dosi di tutta la logica di trasmissione/elaborazione delle informazioni.Tutti i metodi forniti dalle API di Flickr sono implementati in PhpFlickr.La lista completa dei metodi forniti dalleAPI Flickr è disponibile all’URLhttp://www.flickr.com/services/api/. Per invocare un metodo tramitePHPFlickr è sufficiente togliere la parola “flickr” e sostituire i punti concaratteri underscore. Così, per esempio, se si desiderasse invocare il me-todo

flickr.photos.search

Occorrerebbe, una volta instanziata un oggetto phpFlicke, utilizzar-ne il metodo:

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 120

Page 123: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 121

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

$php_flickr = new phpFlickr();

$php_flickr->photos_search()

Oppure per

flickr.photos.licenses.getInfo

Si dovrà utilizzare:

$php_flickr->photos_licenses_getInfo()

Occorre fare attenzione al fatto che la sintassi è case sensitive: lelettere scritte in maiuscolo devono rimanere tali, così come quelle inminuscolo. Dopo questa breve disamina su PhpFlickr passiamo ad unesempio pratico di utilizzo.

Un primo esempioIl primo esempio di utilizzo delle API Flickr tramite PhpFlickr consi-ste nel chiedere un determinato numero di foto appartenenti ad un

Figura 7.3: Come si presenta l’applicazione.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 121

Page 124: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet122

Altri Mashup in PHPLAVORARE CON

INTERNET

certo utente e visualizzare nella parte sinistra di una pagina web leicone relative alle foto ottenute. Selezionando con il mouse l’icona,la foto corrispondente viene visualizzata nella parte destra della pa-gina. L’aspetto della pagina è quello rappresentato in figura 7.3Passiamo ad analizzare le parti significative del codice:

<?php

require_once("phpFlickr/phpFlickr-2.1.0/phpFlickr.php");

$fh = fopen("FlickrApiKey.txt", "r");

if (!$fh)

{

die("Non si può trovare la chiave");

}

$api_key = fread($fh, filesize("FlickrApiKey.txt"));

fclose($fh);

$f = new phpFlickr($api_key);

$i = 0;

Il significato del primo frammento di codice è abbastanza chiaro:semplicemente viene letta la chiave di accesso alle API Flickr e vie-ne instanziato un oggetto della classe PhpFlickr.

if (!empty($_POST['username'])) {

$person = $f->people_findByUsername($_POST['username']);

$photos_url = $f->urls_getUserPhotos($person['id']);

$photos = $f->people_getPublicPhotos($person['id'],NULL, $_POST

[photos]);

Se il parametro ‘username’, trasmesso dalla form richiedente, non è

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 122

Page 125: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 123

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

vuoto, allora viene utilizzato il metodo people_findByUsername (cheva ad effettuare una chiamata, come detto,al metodo flickr.people.findByU-sername) per ottenere l’identificativo che Flickr ha assegnato a ta-le utente. Ottenuto tale valore lo si utilizza per ottenere le foto pub-bliche (nel numero specificato dalla form di input) inserite dall’user-name in oggetto. Questo viene fatto semplicemente utilizzando ilmetodo people_getPublicPhotos. Si noti come l’utilizzo di phpFlickrsemplifichi notevolmente la vita, in quanto le informazioni relativealle foto richieste sono rese immediatamente disponibili in un arraysenza che il programmatore debba effettuare alcun lavoro di elabo-razione sulla risposta del servizio.A questo punto non resta che scor-rere l’array e generare l’output HTML adeguato.

$i = 0;

$count = 0;

$html = "";

$js = "";

foreach ((array)$photos['photo'] as $photo) {

$html .= '<a href="#" onClick ="';

$html .= 'changePhoto('.$count].');">';

$html.= '<img border="0" alt="'.$photo[title].'" ' . 'src=' .

$f->buildPhotoURL($photo, "Square") . '>';

$html.= '</a>';

$js.= "photos[$count]=\"".$f->buildPhotoURL($photo, "Medium")."\";\n";

$count++;

$i++;

if ($i % 6 == 0) {

$html .= "<br>\n";

}

}// foreach

}

echo $_html;

?>

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 123

Page 126: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet124

Altri Mashup in PHPLAVORARE CON

INTERNET

Viene scorso l’array delle foto e costruito l’html che dispone le foto nelformato di icone (utilizzando il metodo buildPhotoUrl con parametro“Square”). Selezionando un’icona viene richiamato il metodo JavascriptchangePhoto() con parametro il numero della foto.Tra un attimo vedremoin che cosa consiste tale metodo. Per ora evidenziamo che, come il letto-re avrà probabilmente osservato,nel frammento di codice precedente vie-ne costruita una stringa,assegnata alla variabile $js, che contiene un pez-zo di codice Javascript.Tale stringa viene inserita nella funzione Javascriptriportata qui sotto, il cui compito è quello di assegnare le foto ad un arrayJavascript. Questo array contiene l’url della foto e la sua formattazionecome “Medium”, come si vede dal metodo PhpFlickr utilizzato.

<script language="JavaScript1.1">

var photos=new Array();

var which=0;

<?php echo $js ?>

</script>

La pagina HTML contiene, inoltre, un tag IMG denominato phptoslider

<img src=" " name="photoslider">

A questo punto rimane da chiarire la funzione Javascript changePhoto, in-vocata quando viene selezionata un icona. Essa, semplicemente, asse-gna come source all’immagine ‘photoslider’ la foto corrispondente al-l’url contenuto nell’array Javascript photos all’indice selezionato.

function changePhoto(index){

document.images.photoslider.src=photos[index];

}

In questo modo, selezionando l’icona numero x, la foto il cui indiriz-zo è contenuto nella posizione x dell’array photo viene assegnata

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 124

Page 127: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 125

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

all’imagine’photoslider’. L’esempio, completo di tutti i sorgenti, è di-sponibile sotto la directory FlickrExample1.

Secondo esempio:Rappresentazione ad alberoIl secondo esempio proposto è un po’ più complesso del preceden-te. Sfrutta ancora le API di Flickr, sia pur utilizzando metodi diversi ri-spetto a quanto visto in precedenza, per accedere ad una serie di fo-to e visualizzarle. La particolarità sta proprio nella componente chesi occupa della visualizzazione.Verrà infatti utilizzato un pacchettoJavascript Ajax per la visualizzazione di grafi. Dato che Flickr forni-sce la possibilità di classificare le foto inserite per argomento, l’e-sempio che verrà illustrato in questo capitolo si occuperà di estrar-re le foto di un utente classificate per argomento e di fornirne unarappresentazione ad albero secondo lo schema visualizzato nella fi-gura 7.4.

Quindi, a partire da una radice, che conterrà il nome dell’utente le cui fo-to sono state richieste, si costruiranno i nodi figli, uno per ogni argomen-

Figura 7.4: Schema di visualizzazione ad albero delle foto.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 125

Page 128: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet126

Altri Mashup in PHPLAVORARE CON

INTERNET

to, che avranno visualizzato il nome dell’argomento. Per ogni nodo “ar-gomento” verranno costruiti i figli che consisteranno in icone rappresen-tanti le foto corrispondenti e contenenti i link alle foto su Flickr. L’alberocosì costruito viene visualizzato sullo schermo ed è possibile spostarlo ospostare i vari nodi, ottenendo un effetto molto particolare. E’ importan-te sottolineare come tale effetto dinamico sia ottenuto esclusivamente tra-mite Javascript, senza utilizzare flash od altri strumenti di animazione.Per una corretta visualizzazione si raccomanda l’utilizzo del borwser Mo-zilla Firefox.

Introduzione a JSVIZJSVIZ è una libreriaAjax (acronimo diAsynchronous JavascriptAnd Xml)open source che permette la rappresentazione di dati sotto forma di gra-fi. Tali grafi possono essere creati in ogni elemento HTML, anche se, nor-malmente, vengono posti dentro il tag <body>. La seguente istruzione,per esempio, instanzia un grafo di tipo snowFlake (fiocco di neve)

var layout = new SnowflakeLayout( document.body, true );

Tramite poi l’oggetto layout si definisce la gestione dell’inserimento didifferenti tipi di nodo nel grafo. Per ogni tipo di nodo occorre segnalareal layout come creare un modello ed una vista (“model” and “view”) delnuovo nodo. L’attributo model definisce, per il caso snowFlake, le seguen-ti caratteristiche del nodo:

- childRadius: l’ampiezza del lato dei nodi figli- fanAngle: l’angolo massimo in cui porre i nodo figli- rootAngle: l’angolo iniziale del grafo (per i figli viene calcolatoautomaticamente)

Questi parametri determinano come il nuovo nodo andrà ad interagire congli altri nodi del grafo. L’attributo “model” ritornerà un oggetto Javascriptcontenente queste variabili, come nel frammento di codice sottostante.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 126

Page 129: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 127

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

layout.config._default = {

model: function( dataNode ) {

return {

childRadius: 40,

fanAngle: dataNode.root ? 360: 100,

rootAngle: 0

}

},

L’attributo view definisce invece l’aspetto del nodo. Ritorna un ele-mento DOM. JSViz supporta sia elementi HTML che elementi di ti-po SVG. Questa breve disamina non esaurisce certo le caratteristichedel prodotto, ma vuole solo essere una piccola introduzione alla lo-gica ed alla struttura di JSVIZ. Una dettagliata discussione delle ca-ratteristiche di JSVIZ comporterebbe probabilmente un libro intero,data la complessità di questo pacchetto.Non occorre però perdersi d’animo di fronte a queste considerazio-ni. Difatti JSVIZ mette a disposizione una classe, XMLTreeLoader, in-clusa nella distribuzione, che costruisce automaticamente un grafoa partire dalla struttura gerarchica contenuta in un documento XML.

var loader = new XMLTreeLoader( layout.dataGraph );

loader.load( "treedata1.xml" );

Per cui con pochi accorgimenti saremo in gradi di utilizzare JSViz senza do-ver necessariamente approfondire la complessità delle sue funzioni. Nel-l’esempio costruiremo un file XML ad hoc a partire dalla risposta di flickee tramite esso costruiremo il grafo di visualizzazione delle foto. Per utiliz-zare jsviz occorre collegarsi al sito http://jsviz.org e scaricare la libreria perpoi scompattarla in una directory posta sotto la root dell’applicazione.

Costruzione della struttura XMLAndiamo ad esaminare il codice che va a costruire il documento

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 127

Page 130: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet128

Altri Mashup in PHPLAVORARE CON

INTERNET

XML per la visualizzazione del grafo delle foto.

<?php

require_once("phpFlickr/phpFlickr-2.1.0/phpFlickr.php");

$fh = fopen("FlickrApiKey.txt", "r");

if (!$fh)

{

die("Non si può trovare la chiave");

}

$api_key = fread($fh, filesize("FlickrApiKey.txt"));

fclose($fh);

$xml_file = '<root>';

$f = new phpFlickr($api_key);

if (!empty($_POST['username']))

{

$person = $f->people_findByUsername($_POST['username']);

$groups = $f->people_getPublicGroups($person['id']);

Se il parametro ‘username’, trasmesso dalla form richiedente, non èvuoto, allora, come nell’esempio precedente viene utilizzato il meto-do people_findByUsername (che va ad effettuare una chiamata, co-me detto, al metodo flickr.people.findByUsername) per ottenere l’i-dentificativo che Flickr ha assegnato a tale utente. Ottenuto tale va-lore si procede con l’invocazione del metodo getPublicGroups per ot-tenere la lista di gruppi tematici eventualmente utilizzati dall’uten-te per raggruppare le sue foto. PhpFlickr ci facilita la vita anche sta-volta rendendo immediatamente disponibile la lista in un array.

foreach ((array)$groups as $group) {

$xml_file.='<node txt="'.$group['name'].'" url="no">';

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 128

Page 131: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 129

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

$photos=$f->groups_pools_getPhotos($group['nsid'],NULL,NULL,NULL,3);

foreach ((array)$photos['photo'] as $photo) {

$xml_file.='<node txt="'.$f->buildPhotoURL($photo, "Square");

$xml_file .= '" url="http://www.flickr.com/photos/';

$xml_file .= $photo['owner'] . '/' . $photo['id'].'">';

$xml_file.='</node>';

}

$xml_file.='</node>';

}

}

$xml_file .= '</root>';

L’array dei gruppi viene scorso e per ogni gruppo viene creato unnodo con attributi text =”<nome_del_gruppo>” e url=”no”. Perogni gruppo viene anche effettuata la richiesta delle foto relative,tramite l’invocazione del metodo group_pools_getPhotos e, per ognifoto, viene costruito un nodo con attributi txt=<foto_iconizzata> etext=<url_della_foto>. Il documento XML così costruito viene quin-di salvato nel file denominato treedata.xml

$myFile = "treedata.xml";

$fh = fopen($myFile, 'w') or die("can't open file");

fwrite($fh, $xml_file);

fclose($fh);

?>

L’esempio sottostante riporta il file XML costruito dalla procedura apartire dalla richiesta dei gruppi dell’utente sarahmorton.

<?xml version="1.0" encoding="UTF-8"?>

<root>

<node txt="Ghost Towns" url="no">

<node txt="http://farm1.static.flickr.com/206/445779025_2d72a0046d_s.j

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 129

Page 132: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet130

Altri Mashup in PHPLAVORARE CON

INTERNET

pg" url="http://www.flickr.com/photos/28066877@N00/445779025"/>

<node txt="http://farm2.static.flickr.com/1247/776654981_cc42f9092f_s.j

pg" url="http://www.flickr.com/photos/86821176@N00/776654981"/>

<node txt="http://farm2.static.flickr.com/1149/776654983_370ef476e1_s.

jpg" url="http://www.flickr.com/photos/86821176@N00/776654983"/>

</node>

<node txt="Mid-Century, Modern Interiors" url="no">

<node txt=http://farm2.static.flickr.com/1052/792601182_bc74a98ff7_s.j

pg url="http://www.flickr.com/photos/66914691@N00/792601182"/>

<node txt="http://farm2.static.flickr.com/1232/791716321_ff419110e0_s.

jpg" url="http://www.flickr.com/photos/66914691@N00/791716321"/>

<node txt="http://farm2.static.flickr.com/1311/792591644_619e01674c_s

.jpg" url="http://www.flickr.com/photos/66914691@N00/792591644"/>

</node>

<node txt="Wash Your Hands Say Yeah" url="no">

<node txt="http://farm1.static.flickr.com/225/550339722_0e144fcd97_

s.jpg" url="http://www.flickr.com/photos/23806189@N00/550339722"/>

<node txt="http://farm1.static.flickr.com/62/161384021_ec0e1f1677_

s.jpg" url="http://www.flickr.com/photos/19873755@N00/161384021"/>

<node txt="http://farm1.static.flickr.com/52/130976947_e40edf8513_

s.jpg" url="http://www.flickr.com/photos/53525732@N00/130976947"/>

</node>

</root>

Adesso non resta che passare ad esaminare il codice della pagina che,utilizzando Jsviz, costruisce il grafo utilizzando la struttura XML co-struita in precedenza. Innanzitutto occorre importare i moduli Java-script di JSVIZ necessari; nell’esempio si ipotizza che tali moduli sia-no presenti nella sottodirectory jsviz.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3

.org/TR/html4/strict.dtd">

<html>

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 130

Page 133: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 131

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /

>

<title>JSViz e Flickr</title>

<!-- JSViz Libraries -->

<script language="JavaScript" src="jsviz/physics/ParticleModel.js"/>

<script language="JavaScript" src="jsviz/physics/Magnet.js"/>

<script language="JavaScript" src="jsviz/physics/Spring.js"/>

<script language="JavaScript" src="jsviz/physics/Particle.js"/>

<script language="JavaScript" src="jsviz/physics/RungeKuttaIntegrator.js

"/>

<script language="JavaScript" src="jsviz/layout/graph/ForceDirected

Layout.js"/>

<script language="JavaScript" src="jsviz/layout/view/HTMLGraphView.js"

/>

<script language="JavaScript" src="jsviz/layout/view/SVGGraphView.js"/

>

<script language="JavaScript" src="jsviz/util/Timer.js"/>

<script language="JavaScript" src="jsviz/util/EventHandler.js"/>

<script language="JavaScript" src="jsviz/io/DataGraph.js"/>

<script language="JavaScript" src="jsviz/io/HTTP.js"/>

<script language="JavaScript" src="jsviz/io/XMLTreeLoader.js"/>

La parte più significativa del codice è contenuta nella funzione init(), edè la ridefinizione della“view”,ovvero della modalità di visualizzazione delnodo. Viene, innanzi tutto, effettuata una discriminazione sulla naturadel nodo. Se l’attributo url è uguale a «no», allora siamo di fronte ad unnodo che contiene la descrizione del gruppo dentro l’attributo txt. Percui viene associato al nodo del codice HTML che riporta il contenuto del-l’attributo txt ingrassetto e con colore blu.Nel caso in cui, invece, l’attri-buto url non dovesse essere uguale a « no », il nodo da trattare è un no-

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 131

Page 134: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet132

Altri Mashup in PHPLAVORARE CON

INTERNET

do «figlio», contenente i dati di una foto. Per cui gli viene associato delcodice HTML contenente l’immagine iconizzata ed il link alla immaginesu Flickr. Le righe in grassetto, nel frammmento di codice seguente, ripor-tano quanto descritto.

<script language="JavaScript">

function init() {

...

{

var nodeElement = document.createElement( 'div' );

nodeElement.style.position = "absolute";

nodeElement.style.width = "22px";

nodeElement.style.height = "22px";

if (dataNode.url !="no"){

nodeElement.innerHTML = '<A HREF="' + dataNode.url + '"><IMG SR

C="' + dataNode.txt + '" WIDTH="22"></A>';

}

else{

nodeElement.innerHTML = '<FONT COLOR="BLUE"><B>' + dataNode

.txt + '</B></FONT>';

}

nodeElement.onmousedown = new EventHandler( layout, layout.

handleMouseDownEvent, modelNode.id )

return nodeElement;

}

}

}

La funzione magnet ritorna un oggetto Javascript con l’attributo mi-nimumDistance settato a 20 pixel. Si tratta della distanza minimache potrà intercorrere tra un nodo e l’altro....

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 132

Page 135: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 133

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

layout.forces.magnet = function() {

return {

...

minimumDistance: 20

}

...

Adesso occorre utilizzare la classe XMLTreeLoader per caricare i da-ti contenuti nel file treedata.xml nel grafo così definito.

var loader = new XMLTreeLoader( layout.dataGraph );

loader.load( "treedata.xml" );

Nella figura sottostante (Figura 7.5) ecco come appare l’applicazio-ne utilizzando i dati dell’esempio. Come si può notare l’aspetto edil comportamento sono molto particolari.Abbiamo utilizzato i servi-zi di Flickr per costruire un mashup particolarmente originale nellayout. Le classi fornite, contenute nella directory flickerexample2.

Figura 7.5: Come si presenta l’applicazione.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 133

Page 136: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet134

Altri Mashup in PHPLAVORARE CON

INTERNET

UN ESEMPIO CON TECHNORATIOra faremo la conoscenza di Technorati, il motore di ricerca dedica-to ai blogs, e vedremo come utilizzare le interfacce che questo pro-dotto mette a disposizione per creare una piccola applicazione chene riprenda i concetti di base.

Introduzione a TechnoratiChe cos’è, esattamente, Technorati? Partiamo dalla definizione chene dà Wikipedia:“Technorati è un motore di ricerca dedicato al mon-do dei blog. Dal dicembre 2005 Technorati indicizza più di 20 milio-ni di blog. Technorati è stato fondato da Dave Sifry e la sede è pres-so San Francisco, California, USA.”. Il termine technorati è una pa-rola macedonia, cioè un termine nato dall'unione di due parole:Te-chnological literati (traducibile in italiano come intellettuali tecnolo-gici). L’enorme diffusione che i blog hanno avuto negli ultimi anni haportato all’esigenza di un motore di ricerca dedicato a questo par-ticolare tipo di siti. Un motore di ricerca che aiutasse a monitorarele conversazioni, a capire chi dice cosa di chi, ad indicare gli argomen-ti più popolari. Technorati si occupa proprio di questo. Dal punto divista tecnico – ed in estrema sintesi – potremmo dire che si occupadi individuare ed archiviare i link, permettendo agli utenti di visua-lizzare quante e quali pagine linkano un determinato indirizzo. Il nu-mero di link che puntano ad una data pagina ne determina il rank,vale a dire l’importanza, il livello di influenza.Technorati misura duedifferenti tipi di links, che vanno a determinare due tipi di popolaritàdiverse: gli inbounds links e gli inbounds blogs.L’esempio di questo capitolo si occuperà proprio di interrogare i ser-vizi Technorati per ottenere, a partire dall’url di un blog fornita comeparametro, le informazioni sui blogs che lo referenziano. Informazio-ni che ci serviranno per creare un grafico dei vari gradi di popolaritàdi questi blogs. Prima di andare avanti con la presentazione dell’e-sempio occorre, a questo punto, approfondire brevemente i concet-ti di inbound links e inbound blogs.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 134

Page 137: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 135

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

Inbound Links e Inbound Blog:che cosa sono e a che cosa servonoCon il termine inbound links di un sito si intendono i links esterniche puntano al sito stesso. La loro utilità è chiara: servono per farearrivare navigatori provenienti da altre pagine sul sito, andando co-sì ad incrementarne la popolarità. Più un sito viene visitato più que-sto diventerà popolare. Il linking esterno ha poi una notevole impor-tanza in quanto fondamentale per poter acquisire un buon piazza-mento all’interno dei motori di ricerca.L’utilizzo che Technorati fa degli inbound links è quello di parametroper misurare la link popularity, ovvero l’indice di popolarità di un si-to.Gli inbound blogs sono concettualmente simili agli inbounds link,ma si riferiscono in maniera specifica ai blog. Gli inbound blogs di unblog (perdonate il gioco di parole) sono quindi i links ad un blogcontenuti in altri blog. Vale per gli inbound blogs il discorso fatto pergli inbound links: tanto più un blog è referenziato da altri, tanto piuquesto è influente nella blogosfera.Tramite questo parametro Tech-norati definisce quali sono i blog più influenti nei paesi occidentali.Certo, ci si potrebbe domandare se il fatto che un blog abbia un nu-mero elevato di “inbound blogs” basti automaticamente ad indi-carlo come “autorevole ed influente”. Probabilmente, per un blog,andrebbe analizzata, oltre alla quantità, anche la qualità dei blog(o dei siti generici) che lo referenziano. Se il mio blog fosse linkato,per dire, dal “Corriere della Sera”, questo collegamento dovrebbe ra-gionevolmente essere pesato diversamente rispetto ad eventuali al-tri provenienti dai blogs dei miei vicini di casa. Non me ne voglianoquesti ultimi.Al di là di queste doverose considerazioni, occorre prendere attoche, in ogni caso,Technorati è de facto lo standard per la misura del-la popolarità dei blog.Dopo questa disamina sui concetti che andremo a trattare non re-sta che cominciare a lavorare con le API che ci mette a disposizione.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 135

Page 138: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet136

Altri Mashup in PHPLAVORARE CON

INTERNET

Un percorso obbligato:procurarsi una KeyCome in quasi tutti gli esempi visti sino ad ora, per usufruire dei ser-vizi web che le grandi aziende espongono, occorre procurarsi unachiave.Technorati non differisce, in questo, da altre importanti realtàdel web come Google,YouTube o Flickr.Analogamente a Flickr - e adifferenza di quanto accade, per esempio, con Google Maps - lachiave fornita non identifica un sito che la utilizza ma un utente. Percui, una volta acquisita, potrete usarla anche su differenti domini. Sitratta, anche in questo caso, di un codice alfanumerico ed il proce-dimento da seguire per ottenerla è identico a quanto visto in altri esem-pi. È necessario, per prima cosa, registrarsi sul sito ed accedere al-la pagina http://www.technorati.com/developers/apikey.html, riem-pire la form proposta a video e conservare la stringa generata.

Technorati Cosmos, Richeste e RispostePer eseguire query sulle caratteristiche dei blog contenuti nella sua basedati, Technorati ha sviluppato le API Cosmos, di cui si può trovare unadettagliatadocumentazioneall’indirizzo http://technorati.com/developers/api/co-smos.html. Non entreremo, nel corso di questo paragrafo, nel dettagliodi questeAPI, in quanto ci avvarremo di uno strumento, analogamente aquanto visto nel corso dell’esempio su Flickr, che ce le renderà comple-tamente invisibili. È, in ogni caso, necessaria una sintetica rappresenta-zione del formato di dati fornito da Cosmos per agganciarci ai concetti de-scritti sino ad ora. Cosmos accetta in input una query contenente, tra glialtri parametri, l’URL di un determinato blog.Altri parametri sono la chia-ve di riconoscimento (obbligatoria), il limite massimo di risultati da estrar-re, il formato con qui questi debbono essere forniti eccetera.Queste API, quindi, utilizzano un’interfaccia REST, da invocare tramiteuna GET od un POST HTTP. Per esempio, una chiamate potrebbe esserela seguente:

http://api.technorati.com/cosmos?key=<api_key>&url=<url_del_blog>

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 136

Page 139: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 137

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

E questo il formato della risposta:

<?xml version="1.0" encoding="utf-8"?>

<tapi version="1.0">

<document>

<result>

<url>URL per cui è stata fatta la richiesta</url>

<weblog>

<name>Nome del Blog</name>

...

<inboundblogs>Numero di INBOUND BLOGS</inboundblogs>

<inboundlinks>Numero di INBOUND LINKS</inboundlinks>

...

</weblog>

...

</result>

<item>

<weblog>

<name>Nome del Blog che linka quello principale</name>

<url>URL del Blog</url>

...

<inboundblogs>Numero di INBOUND BLOGS</inboundblogs>

<inboundlinks>Numero di INBOUND LINKS</inboundlinks>

...

</weblog>

...

</item>

... // Lista degli altri blog sotto il tag Item

</document>

</tapi>

Il tag <result> contiene i dati del blog il cui indirizzo è stato invia-to come parametro. A questo segue un’eventuale lista di entità

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 137

Page 140: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet138

Altri Mashup in PHPLAVORARE CON

INTERNET

<item> contenenti i dati dei blogs che hanno al loro interno links alblog in oggetto. In grassetto i tags <inboundblogs> ed <inbound-links>, contenenti le informazioni che andremo a prelevare ed il cuisignificato è stato spiegato nel corso dei paragrafi introduttivi.Da notare che, nel caso in cui l’URL fornito a Cosmos non risulti es-sere associato ad un blog, l’elemento <weblog>, e tutti i suoi figli,non compariranno all’interno dell’elemento <result>.

<tapi version="1.0">

<document>

<result>

<url>URL per cui è stata fatta la richiesta</url>

<inboundblogs>Numero di INBOUND BLOGS</inboundblogs>

<inboundlinks>Numero di INBOUND LINKS</inboundlinks>

</result>

<item>

<weblog>

...

</weblog>

...

</item>

...

</document>

</tapi>

Entriamo adesso nel concreto dell’esempio, presentando lo stru-mento di cui ci avvarremo per sfruttare i servizi Technorati

Services Technorati,un wrapper per CosmosPer comunicare con i servizi Technorati utilizzeremo lo stesso ap-proccio adottato nel caso di Flickr: anziché comporre la richiesta edeffettuare direttamente il parsing della risposta XML, lasceremo che

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 138

Page 141: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 139

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

uno strumento si occupi di effettuare per noi questo lavoro “sporco”restituendoci i dati in un formato intuitivo ed immediatamente uti-lizzabile. Lo strumento di cui sto parlando è un pacchetto free, chia-mato Services Technorati, e disponibile per il download all’indirizzohttp://pear.php.net/package/Services_Technorati. Seguire le istru-zioni di download (peraltro estremamente dettagliate) per scarica-re i files indicati sul proprio computer e, una volta effettuato il down-load, scompattarli sotto una directory della propria applicazione. Leclassi risulteranno immediatamente disponibili. Di fatto Services Te-chnorati fornisce un’interfaccia Object Oriented alle API Technorati,,e con pochissime righe di codice è possibile accedere a tutte le infor-mazioni da esse fornite.

Accesso ai servizi TechnoratiDi seguito alcuni frammenti del codice che, utilizzando Services Te-chnorati, interroga le API. Prima di tutto occorre instanziare la clas-se fornendo come parametro la Key.

...

$fh = fopen("TechnoratiKey.txt", "r");

if (!$fh)

{

die("Non si può trovare la chiave");

}

$techno_key = fread($fh, filesize("TechnoratiKey.txt"));

fclose($fh);

$tapi =& Services_Technorati::factory($techno_key);

...

Parlando di interfaccia Object Oriented non si esagerava: per ovviarre adeventuali modifiche alleAPI sottostanti, che renderebbero il codice obso-leto, queste vengono accedute tramite un metodo factory.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 139

Page 142: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet140

Altri Mashup in PHPLAVORARE CON

INTERNET

Una volta instanziato l’oggetto occorre passargli le queries da ef-fettuare ed il risultato sarà contenuto nell’oggetto $technorati_re-sponse. Questo altro non è che un array multidimensionale contenen-te tutte le informazioni ritornate da Cosmos. Per intendersi, Servi-ces Technorati parsa il messaggio XML di risposta ed inserisce i va-lori in un oggetto gerarchizzato di questo tipo:

Array(

[version] => 1.0

[document] => Array(

[result] => Array(

[username] => pippo

...

)

[item] => Array(

[0] => Array(

[weblog] => Array(

[name] => Nome Blog 0 ...

...

[inboundblogs] => 52

[inboundlinks] => 82

...

)

)

[1] => Array(

[weblog] => Array(

...

)

)

[2] =>...

)

)

)

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 140

Page 143: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 141

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

Ottenuto questo oggetto passiamo a fornire una rappresentazione gra-fica dei risultati ottenuti. Rappresenteremo,all’interno di una pagina web,un grafico a barre in cui, per ogni blog ritornato da Cosmos in risposta aduna query, saranno rappresentati gli inbound links e gli inbound blogs.Loschema di quanto vorremmo ottenere è riportato nella Figura 7.6.

Per la costruzione del grafico delle caratteristiche dei blogs verrà uti-lizzato lostrumento PHP/SWF Charts, disponibile all’indirizzohttp://maani.us/xml_chart.

Rappresentazione graficadei risultati con PHP/SWF ChartsPHP/SWF Charts è un pacchetto estremamente potente che permet-te la creazione di grafici su pagine web tramite l’utilizzo di PHP e diMacromedia Flash. La distribuzione base è free; ne esiste anche unaa pagamento (abbastanza economica, a dire il vero) che fornisce al-lo sviluppatore alcune features accessorie. In ogni caso, per i nostriscopi, la versione free è più che sufficiente.Una volta connessi al sito http://maani.us/xml_chart e scaricato ilpacchetto, occorre scompattarlo in una directory sottostante la ra-

Figura 7.6: Come dovrebbe apparire il grafico dei blogs

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 141

Page 144: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7

I libri di ioPROGRAMMO/Lavorare con Internet142

Altri Mashup in PHPLAVORARE CON

INTERNET

dice della nostra applicazione.Per utilizzarlo è sufficiente scrivere due semplici pagine PHP. La pri-ma è la seguente:

<HTML>

<BODY>

<?php

include "charts/charts.php";

echo InsertChart ( "charts/charts.swf", "charts/charts_library", "data.php"

, 800, 400 );

?>

</BODY>

</HTML>

Di una semplicità estrema. Viene inclusa la classe charts.php, com-presa nel pacchetto scaricato. Dopodiché si esegue la direttiva Insert-Charts che, come parametri, ha: i cammini ai files charts.swf ed al-la directory charts_library (anche questi files sono compresi nella di-stribuzione); la pagina data.php che contiene i dati da visualizzaree che, tra un attimo, vedremo come costruire; la larghezza e l’altez-za in pixel del grafico.Passiamo alla pagina data.php. Questa si occupa di ricevere l’og-getto ritornato da technorati, di costruire con esso un altro oggettoad hoc che verrà renderizzato a video dal file charts.swf.

<?php

...

$tapi =& Services_Technorati::factory($api_key);

$techno_result = $tapi->cosmos($_POST['url'], NULL);

L’oggetto $techno_result viene scorso e si utilizzano i nomi dei blogse le informazioni contenute nelle sezioni inboundlinks e inbound-

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 142

Page 145: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 143

Altri Mashup in PHPCapitolo 7LAVORARE CONINTERNET

blogs per costruire un altro array multidimensionale, assegnato al-la variabile $blogs_chart, così strutturato:

$blogs_chart [ 'chart_data' ] = array (

array ( "", "Nome blog1", "Nome blog2", ... , "Nome blog n" ),

array ( "Inbounds Links", 6, 12, 20, 4 ),

array ( "Inbounds Blogs", 18, 20, 65, 55 )

);

L’ultimo passo consiste nell’inviare l’array così costruito al filecharts.swf che ne effettuerà il rendering a video.

SendChartData ( $blogs_chart );

In figura 7.7 un esempio del risultato che si otterrà a partire dall’in-serimento, in una apposita form, dell’URL di un blog.

Figura 7.7: Esempio di risultato della nostra applicazione.

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 143

Page 146: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 7 (111-144):007-050 31-08-2007 17:14 Pagina 144

Page 147: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 145

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

ALTRI MASHUP IN JAVA

Anche numerosi siti di e-commerce offrono l’accesso alle proprie fun-zionalità pubblicando apposite API. Un esempio è E-Bay, ma ancheAmazon offre servizi di questo tipo. Di seguito si creerà un mashup trale ricerche sui sitiWeb usando le funzionalità di Google e le ricerche suiprodotti (in particolare sui libri) usando i servizi esposti daAmazon. Poisi vedrà come usare i Feed pubblicati daYouTube per creare un mashupdi sicuro effetto!

RICERCHE SU AMAZON E GOOGLEAGoogle ha da sempre la sua punta di diamante nel suo motore di ri-cerca. Tale motore espone le proprie funzionalità sia come API invoca-bili lato server che, e questa è una recente novità, permette di usarleanche con delle librerie JavaScript che, grazie ad AJAX, sono utilizzabi-li lato client senza passare dal server.Amazon, d’altro canto, offre l’accesso ai suoi tanti prodotti usando op-portuneAPI invocabili via SOAP,grazie ad una libreria di sviluppo perWebServices. Nell’esempio che segue si combineranno queste due tecnolo-gie per una ricerca “trasversale” che fa ricerche su sitiWeb con Googlee sui libri (e solo su di essi) venduti da Amazon. Prima di scendere neidettagli dell’esempio, una breve panoramica delle funzionalità espostedai due servizi.

E-Commerce Service di AmazonAmazon offre numerosi Web Services (si veda, per una panoramica, lapagina http://aws.amazon.com). Particolarmente interessante è il ser-vizio E-Commerce Service (d’ora in poi ECS). Grazie ad esso è possibi-le reperire informazioni sui tanti prodotti venduti da Amazon. Oltre al-le informazioni è possibile sfruttare tutte le caratteristiche di un moder-no servizio di e-commerce (carrello della spesa, gestione dei vari vendi-

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 145

Page 148: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet146

Altri Mashup in JavaLAVORARE CON

INTERNET

tori, disponibilità in magazzino, prezzi e storico dei prezzi e così via) an-che se questa parte, per questo esempio specifico, non verrà sfruttata.In questo momento è importante osservare che tutte le operazioni diECS non modificano lo stato degli oggetti venduti, ma ne permettonosolo la loro gestione (intesa come reperimento, filtro e storico).

Un po’ di terminologiaAmazon è evoluto nel tempo fino a diventare un aggregatore di servi-zi e uno spazio di vendita di prodotti non solo suoi ma di un’ampia gam-ma di fornitori, alcuni dei quali con delle caratteristiche “privilegiate” ri-spetto ad altri dovute a loro posizioni di mercato dominanti o a serviziesclusivi, ma che, almeno in principio, non esclude che chiunque possausare Amazon come luogo di vendita dei propri prodotti e/o servizi. Inquesto senso Amazon indica con il termine “marketplace” la totalitàdei prodotti e/o servizi vendibili dal suo portale. I servizi ECS permetto-no l’accesso solo ad un sottoinsieme di prodotti che sono quelli relati-vi ai venditori precedentemente indicati come “privilegiati” e che ven-gono chiamati “Pro Merchant Sellers” e “Merchant@ vendors”. Comefornitori di un servizio di accesso ai prodotti venduti daAmazon possia-mo avere delle commissioni sul venduto (in questo caso diventiamo de-gli “associati”).

Cercare gli oggettiCiascun oggetto venduto da Amazon ha un proprio identificativo uni-voco; esso è chiamato ASIN ( iniziali di “Amazon Standard Item Num-ber”) e per i libri, caso che ci interessa per l’esempio, esso coincide conil codice ISBN. L’operazione di ricerca principale in ECS è chiamata Item-Search; essa permette di impostare le caratteristiche desiderate e di re-perire tutti gli oggetti che soddisfano a tali caratteristiche. Ma, in con-creto, come si realizza una simile interrogazione?

Ottenere la chiave di accessoCome gran parte dei servizi offerti da Amazon, anche ECS può

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 146

Page 149: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 147

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

essere interrogato dopo essersi registrati al servizio. La registra-zione, tra le altre cose, permette di recuperare il valore di unachiave. Tale chiave va associata ad ogni invocazione fatta dal-l’applicazione che si realizza verso il server di Amazon.ECS, a differenza di altri servizi, è completamente gratuito. Però è ne-cessario prestare particolare attenzione alle sue clausole di utilizzo (sivedahttp://www.amazon.com/AWS-License-home-page-Money/b/ref=sc_fe_c_0_12738641_5/103-2085190-0787832?ie=UTF8&node=3440661&no=12738641 per i dettagli). Tra le altre cose è vietato memorizzare in manierapermanente le informazioni accedute usando il servizio (è permessa unacopia locale per un periodo di tempo che varia dal tipo di dato: per alcu-ni dati si può solo fare una copia cache per non più di 1 mese, per altrinon più di 24 ore!) e sono molto rigide le regole che specificano comeusare le informazioni sui prezzi che si mostreranno all’utente.Per registrar-si, collegarsi alla pagina http://aws.amazon.com/ e seguire il link “Clickhere to sign up”. La registrazione prevede l’inserimento della propriaemail e, se si è utenti diAmazon, della propria password, altrimenti verràcreato un nuovo account. Terminata la registrazione verrà inviata unamail con i dettagli per ottenere la chiave e attivarla.Una volta attivato l’ac-count siamo pronti perla generazione dei client per l’accesso ai servizi.

Generare gli stub del Web ServiceQuando si vuol realizzare unWeb Service con Java,bisogna scegliere il fra-mework o la tecnologia di accesso. Per l’esempio si è scelto di usare XFi-re, ma i passi sono molti simili nel caso si scelga di utilizzare un altro fra-mework come, per esempio,Axis. Di fondamentale importanza è reperi-re il WSDL che descrive tutti i dettagli del servizio. Amazon mette a di-sposizione ilWSDL di ECS alla pagina http://webservices.amazon.com/AW-SECommerceService/AWSECommerceService.wsdl. I passi per la gene-razione degli stub con XFire (passi che vanno inseriti nella console di co-mando o in un file .BAT) consistono nell’inizializzare opportunamente ilclasspath con tutte le librerie:

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 147

Page 150: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet148

Altri Mashup in JavaLAVORARE CON

INTERNET

SET XFIRE_HOME=.

SET LIB=%XFIRE_HOME%/lib

SET GPATH=%XFIRE_HOME%/xfire-all-1.2.6.jar;%LIB%/jaxb-api-2.0.jar;\

%LIB%/stax-api-1.0.1.jar;%LIB%/jdom-1.0.jar;%LIB%/jaxb-impl-2.0.1.jar;

\

%LIB%/jaxb-xjc-2.0.1.jar;%LIB%/wstx-asl-3.2.0.jar;\

%LIB%/commons-logging-1.0.4.jar;%LIB%/activation-1.1.jar;\

%LIB%/wsdl4j-1.6.1.jar;%LIB%/XmlSchema-1.1.jar;\

%LIB%/xfire-jsr181-api-1.0-M1.jar;%ANT_HOME%/lib/ant.jar

Per poi eseguire WsGen con gli opportuni parametri (far riferi-mento alla documentazione di XFire per i dettagli):

java -cp %GPATH%; org.codehaus.xfire.gen.WsGen -wsdl \

http://webservices.amazon.com/AWSECommerceService/AWSECommerce

Service.wsdl? \

-o . -p it.ioprogrammo.mashup.wsclient.amazon -overwrite true

Si noti che lo script specifica anche come dovrà essere formato ilpackage delle classi generate.

Il risultato del comando WsGen è la generazione di tutte le clas-si che permettono di accedere al servizio remoto di ECS (Figura 8.1).

AttenzioneCon il termine “stub” si intende la costruzione dell’infrastrutturaper la comunicazione con il servizio remoto. In particolare gli stubclient sono pronti per essere usati per inviare i messaggi e leggereil contenuto della risposta usando le strutture dati del linguaggio(in questo caso Java) senza preoccuparsi dei dettagli (né di comu-nicazione, in questo caso invocazioni http/https, né di rappresenta-zione dei messaggi, in questo caso messaggi SOAP).

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 148

Page 151: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 149

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

Si noti che tra il nome del package figura anche la data che per-mette di identificare la versione del servizio usato (in questo ca-so 2007-06-13, ovvero il 13 giugno del 2007, essendo il forma-to della data espresso secondo la notazione statunitense).

La parte server dell’esempioLa classe TestAmazon (del package it.ioprogrammo.mashup.wsclient)permette di invocare ECS e ricercare una parola chiave tra i libri grazie almetodo; ecco i dettagli di tale metodo. Il servizio di Amazon che vieneusato è ItemSearch. Esso viene invocato con un opportuno parametro,di tipo OtemSearchRequest, che descrive i filtri desiderati (ovvero lekeyword passate al metodo cercaLibri, e l’indice dei libri):

public static java.util.List<Item> cercaLibri(String keyword){

AWSECommerceServiceClient client = new AWSECommerceServiceClient()

;

Figura 8.1: Tutte le classi generate da XFire per l’accesso a ECS.

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 149

Page 152: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet150

Altri Mashup in JavaLAVORARE CON

INTERNET

AWSECommerceServicePortType port =

client.getAWSECommerceServicePort();

ItemSearch isearch = new ItemSearch();

isearch.setAWSAccessKeyId(keyId);

ItemSearchRequest irequest = new ItemSearchRequest();

irequest.setSearchIndex("Books");

irequest.setKeywords( keyword );

irequest.setSort("daterank");

isearch.setShared( irequest );

ItemSearchResponse iresponse = port.itemSearch(isearch);

java.util.List<Items> libri = iresponse.getItems();

if (libri.size()>0)

return libri.get(0).getItem();

else

return new java.util.ArrayList();

}

È stato evidenziato il codice che imposta i filtri per la ricerca: nel casospecifico viene usato l’archivio dei libri, ricercate le parole chiave passa-te come argomento del metodo e si richiede un ordinamento dei dati perdata di pubblicazione (altri tipi di ordinamento sono reperibili nella docu-mentazione ufficiale e, in particolare, consultando la pagina http://docs.ama-zonwebservices.com/AWSECommerceService/2007-06-13/DG/USSort-ValuesArticle.html#USSortValuesArticle_books ).

Il client e le ricercheLa parte JSP deve prevedere una pagina che si occuperà di chie-dere all’utente le parole da ricercare e di innescare le ricerchesulle diverse fonti. Il primo passo è quello di includere i riferimen-ti alle librerie JavaScript di Google AJAX Api (per i dettagli delservizio si veda http://code.google.com/apis/ajaxsearch/)

<script src=

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 150

Page 153: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 151

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

"http://www.google.com/uds/api?file=uds.js&amp;v=1.0&amp;key=

chiave"

type="text/javascript">

</script>

Inoltre è necessario inizializzare e configurare opportunamente ilservizio di ricerca; infatti tale servizio può ricercare sulle pagineWeb, sui blog, sui video o aziende localizzate su Google Maps. Ec-co come impostare la ricerca sulle sole pagine Web usando, perl’esempio che si realizza, una funzione chiamata OnLoad:

<script language="Javascript" type="text/javascript">

//<![CDATA[

function OnLoad() {

var searchControl = new GSearchControl();

var options = new GsearcherOptions();

options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);

searchControl.addSearcher(new GwebSearch(), options);

searchControl.setResultSetSize(GSearch.LARGE_RESULTSET);

searchControl.draw(document.getElementById("searchcontrol"));

searchControl.setSearchStartingCallback(this, amazonSearch);

}

GSearch.setOnLoadCallback(OnLoad);

//]]>

</script>

Analizzando la riga evidenziata, si nota che è stato settato un“callback” all’inizio di ogni nuova ricerca. In pratica è stata dichia-rata una funzione “amazonSearch” che va invocata all’inizio di ogninuova ricerca. Questo perché si vuol far eseguire l’invocazionedei Web Services di Amazon ogni volta che l’utente ricerca una pa-rola con Google; la funzione è la seguente:

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 151

Page 154: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet152

Altri Mashup in JavaLAVORARE CON

INTERNET

function amazonSearch(searchControl, searcher, query) {

var invoca = "amazon.jsp?query="+query;

GDownloadUrl(invoca, function(doc) {

document.getElementById("searchamazon").innerHTML = doc;

});

return true;

}

Non resta che analizzare la pagina invocata (usando la solita fun-zione GDownloadUrl esposta da Google Maps!), ovvero la pagi-na amazon.jsp; essa non fa altro che passare la query ricevutacome parametro al metodo cercaLibri visto in precedenza:

<%@page import="it.ioprogrammo.mashup.wsclient.*"%>

<%@page import="com.amazon.webservices.awsecommerce

service._2007_06_13.*"%>

<%

String query = request.getParameter("query");

java.util.List<Item> libri = TestAmazon.cercaLibri(query);

System.out.println("amazon.jsp: "+libri.size()+"elementi");

if (libri.size()>0){

AttenzioneAlla pagina http://code.google.com/apis/ajaxsearch/wizards.html èpresente un Wizard estremamente interessante: esso permette digenerare il codice JavaScript adatto ad effettuare alcuni tipi di ri-cerca, personalizzando anche il layout del risultato. È un ottimo mo-do per prendere confidenza con le caratteristiche del servizio, usan-do un approccio “learn by example”.

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 152

Page 155: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 153

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

// stampa i risultati

}else{

%>

Nessun risultato...

<%

}

%>

Di seguito il codice che stampa i dettagli dei risultati reperiti (tracui un ciclo che scorre e stampa la lista degli autori del libro):

for(int ix=0; ix<libri.size() && ix<20; ix++){

Item it= libri.get(ix);

ItemAttributes att=it.getItemAttributes();

%>

<p>Titolo:

<a href="<%= it.getDetailPageURL() %>"

target="_blank"><%= att.getTitle() %></a><br />

Autori:

<%

java.util.List<String> autori = att.getAuthor();

for(int i=0; i<autori.size(); i++)

out.print(autori.get(i));

%>

<br />

ISBN: <%= it.getASIN() %><br />

</p>

<%

}

In Figura 8.2 un esempio, in cui è stata cercata la parola AJAX.

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 153

Page 156: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet154

Altri Mashup in JavaLAVORARE CON

INTERNET

Conclusioni sui Web ServicesQuest’ultimo esempio ha mostrato come due tecnologie,AJAX ei Web Services, possano convivere per creare applicazioni ma-shup. Il limite attuale per l’uso di AJAX è la possibile incompati-bilità tra browser (soprattutto per quelli obsoleti) ma è un limitedestinato a scomparire, man mano che evolvono framework cheincapsulano la logica di interscambio e gestione della comuni-cazione. Per i Web Services è necessario appoggiarsi ad un frameworkesterno, per evitare di perdersi nei tanti dettagli altrimenti ne-cessari per gestire a basso livello la comunicazione tra client eserver. Ma per gli sviluppatori entrambe le tecnologie sono unconcreto vantaggio, sia per rendere più semplice l’uso dell’appli-cazione per gli utenti finali (AJAX), sia per demandare a un ser-vizio esterno gran parte della logica o del reperimento di dati ne-cessari al corretto funzionamento del proprio applicativo (WebServices).

Figura 8.2: Ricerca di AJAX, sia con Goole che sui libri di Amazon.

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 154

Page 157: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

I libri di ioPROGRAMMO/Lavorare con Internet 155

Altri Mashup in JavaCapitolo 8LAVORARE CONINTERNET

IL FUTURO DEI MASHUP…I mashup, siano essi semplici, complessi, che fanno uso di libre-rie di terze parti o siano sviluppati con tecnologie proprietarie,stanno invadendo il Web. Si è aperto il libro citando numerosiservizi per non programmatori. L’intero libro è dedicato a chi pro-gramma e ha descritto alcuni dei tanti frame work e librerie dispo-nibili. Anche altri “big” dell’informatica si stanno adoperandoper fornire framework che, a vario livello, aiutano a creare ma-shup. IBM, per esempio, ha iniziato “AJAX Toolkit Framework”(http://www.alphaworks.ibm.com/tech/ajaxtk) che ben presto è di-venuto uno dei progetti di Eclipse (http://www.eclipse.org/atf/).La Sun ha recentemente rilasciato una nuova versione del suo“Sun Web Developer Pack” (sito di riferimentohttp://developers.sun.com/web/swdp/, per il downloadhttp://developers.sun.com/web/swdp/docs/tutorial/download.html,Figura 8.7). In esso trovano posto tante tecnologie emergenti,tra le quali:

� jMaki: un framework che, grazie a template e a widget AJAX,permette di costruire applicazioni Web 2.0 in maniera modu-lare e semplificata (esistono widget già pronti per i principali servizi!)con plug in per integrare il frame work nei principali IDE esisten-ti;

� Dynamic Faces: estende le Java Server Faces per far sì che l’in-terfaccia supporti il modello AJAX; il tutto senza cambiare gliusuali componenti JSF con cui si sono costruite le applicazio-ni Web “tradizionali”;

� Lightweight Programming Models usando linguaggi dinamiciall’interno della piattaforma Java;

� RESTful Web Services, per la realizzazione di servizi Web se-

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 155

Page 158: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8

I libri di ioPROGRAMMO/Lavorare con Internet156

Altri Mashup in JavaLAVORARE CON

INTERNET

condo il modello REST;

� ROME Propono: per la creazione, organizzazione e gestione difeed Atom.

Questo proliferare di librerie e tecnologie fanno sì che i mashupsi stiano imponendo sempre più nel panorama informatico mon-diale e non c’è dubbio che ogni programmatore di applicazioni Webdebba, prima o poi, confrontarsi con tale approccio. Speriamoche questo libro sia un’utile base su cui costruire tanti e nuovimashup innovativi!

Figura 8.7: Dalla Sun il suo “Sun Web Developer Pack”.

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 156

Page 159: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 157

Page 160: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 158

Page 161: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

Capitolo 8 (145-156):007-050 31-08-2007 17:19 Pagina 159

Page 162: LAVORARE CON • I linguaggi e la loro interazione con i Web ... · Capitolo 1 Introduzione LAVORARE CON INTERNET scambio, in particolare… Feed RSS e Atom Quasi tutte le tecnologie

LAVORARE CONINTERNET

Autori: Filippo Costalli & Ivan Venuti

EDITOREEdizioni Master S.p.A.

Sede di Milano: Via Ariberto, 24 - 20123 MilanoSede di Rende: C.da Lecco, zona ind. - 87036 Rende (CS)

Stampa: Grafica Editoriale Printing - Bologna

Finito di stampare nel mese di Settembre 2007

Il contenuto di quest’opera, anche se curato con scrupolosa attenzione, non puòcomportare specifiche responsabilità per involontari errori, inesattezze o uso scorret-to. L’editore non si assume alcuna responsabilità per danni diretti o indiretti causati

dall’utilizzo delle informazioni contenute nella presente opera. Nomi e mar chi protetti sono citati senza indicare i relativi brevetti. Nessuna parte del testo può esse-

re in alcun modo riprodotta senza auto riz zazione scritta della Edizioni Master.

Copyright © 2007 Edizioni Master S.p. A.Tutti i diritti sono riservati.

Realizzazione grafica:Cromatika Srl

C.da Lecco, zona ind. - 87036 Rende (CS)

Art Director: Paolo CristianoResponsabile grafico di progetto: Salvatore Vuono

Coordinatore tecnico: Giancarlo SiciliaIllustrazioni: Tonino Intieri

Impaginazione elettronica: Francesco Cospite

Tel. 02 831212 - Fax 02 83121206@ e-mail: [email protected]

Servizio Clienti

Tamburino:Tamburino 31-08-2007 17:25 Pagina 1