Sebbene i motori di ricerca su Internet siano numerosi e differenziati per metodologia di ricerca e soprattutto per target (pensiamo ai motori specializzati per i blog, che cercano tra post e commenti), sono pochi quelli che mettono a disposizione API per la ricerca, e comunque in genere attraverso API keys, application IDs e identificatori del genere.
In particolare, le informazioni che viaggiano sulle rete attraverso le API, vengono ben rappresentate da codifiche quali XML e JSON (quest'ultima grazie alle applicazioni AJAX prende sempre più piede). In tal modo le applicazioni possono comunicare secondo un protocollo comune. Le interfacce di tali API sono per lo più XMLRPC, SOAP, e più recentemente REST. Tutte queste interfacce prendono spunto da architetture di tipo CORBA (Common Object Request Broker Architecture), che definiscono un modello per la comunicazione tra componenti remoti, secondo protocolli comuni e descrittori (IDL, Interface Description Language), come appunto la chiamata a procedura remota (Remote Procedure Call).
In particolare, nel caso dei motori di ricerca, i sistemi espongono semplici API XMLRPC o JSONRPC attraverso semplice HTTP GET/HTTP POST, il chè permette di invocare tali API dai più svariati linguaggi (dal JavaScript a Java, da PHP a Perl, da Flash a Ruby, ecc).
In genere, l'output è XML, e se siamo fortunati sotto forma di feed RSS/Atom, altrimenti l'xml ha un DTD (Document Type Definition), oppure ancora sono in JSON (array associati o hash).
Spesso permettono il passaggio di una callback, se chiamati da JavaScript, in modo da avere i risultati della chiamata in una funzione - del tipo foo(results), mentre librerie più sofisticate, permettono di implementare handler veri e propri (pensiamo ad esempio ad ActionScript di Flash).
Eccoci quindi catapultati nel mondo della API della Ricerca.
Iniziamo per ora con la Google AJAX Search API
L'API espone una semplice interfaccia REST e output di tipo JSON. Permette la ricerca su un numero diverso di servizi Google (Web Search, Local Search, Video Search, Blog Search, News Search, Book Search, e Image Search). Permette callback JavaScript, ed è facilmente interfacciabile da JavaScript, ActionScript (Flash), Java, Php, ecc.
Ecco un semplice esempio di chiamata alla AJAX Search API:
curl -e http://www.my-ajax-site.com \
'http://ajax.googleapis.com/ajax/services/search/web?' \ 'v=1.0&q=Paris%20Hilton&callback=foo&context=bar'
Questa produrrà un output JSON del tipo:
{"responseData": {
"results": [
{
"GsearchResultClass": "GwebSearch",
"unescapedUrl": "http://en.wikipedia.org/wiki/Paris_Hilton",
"url": "http://en.wikipedia.org/wiki/Paris_Hilton",
"visibleUrl": "en.wikipedia.org",
"cacheUrl": "http://www.google.com/search?q\u003dcache:TwrPfhd22hYJ:en.wikipedia.org",
"title": "\u003cb\u003eParis Hilton\u003c/b\u003e - Wikipedia, the free encyclopedia",
"titleNoFormatting": "Paris Hilton - Wikipedia, the free encyclopedia",
"content": "\[1\] In 2006, she released her debut album..."
},
{
"GsearchResultClass": "GwebSearch",
"unescapedUrl": "http://www.imdb.com/name/nm0385296/",
"url": "http://www.imdb.com/name/nm0385296/",
"visibleUrl": "www.imdb.com",
"cacheUrl": "http://www.google.com/search?q\u003dcache:1i34KkqnsooJ:www.imdb.com",
"title": "\u003cb\u003eParis Hilton\u003c/b\u003e",
"titleNoFormatting": "Paris Hilton",
"content": "Self: Zoolander. Socialite \u003cb\u003eParis Hilton\u003c/b\u003e..."
},
...
],
"cursor": {
"pages": [
{ "start": "0", "label": 1 },
{ "start": "4", "label": 2 },
{ "start": "8", "label": 3 },
{ "start": "12","label": 4 }
],
"estimatedResultCount": "59600000",
"currentPageIndex": 0,
"moreResultsUrl": "http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8..."
}
}
, "responseDetails": null, "responseStatus": 200}
consentendo pertanto il recupero da remoto dei risultati della ricerca, e un accesso ad essi di tipo associativo (o con notazione puntata):
Supposto results l'array associativo con il precedente JSON, abbiamo:
var firstResult=results.responseData.results[0];
var firstResultUrl=firstResult.url;
var firstResultContent=firstResult.content;
e così via, in modo molto semplice dunque.
LP
Links:
Google AJAX Search API
JSON
XMLRPC
REST
JSONRPC(JABSORB)
CORBA
Un interessante articolo sui DeveloperWorks di IBM mostra come realizzare applicazioni Web2.0 (qui da noi inteso dal punto di vista tecnologico, ovvero AJAX) utilizzando il paradigma COMET (ridefinizione di AJAX in chiave push server-side piuttosto che polling client-side detto in breve) e DWR, ovvero Direct Web Remoting.
Questo ultimo approccio consiste agli script JavaScript client-side di interagire con applicazioni Java server-side (quali ad esempio servlet) attraverso dati/funzioni codificate secondo il formato standard JSON. In sostanza le classi di servizio di DWR generarano degli handler per le funzioni JavaScript. DWR si occupa quindi di remotizzare i Beam Java in JSON e farne il dispatch agli opportuni handler.
Il paradigma COMET traduce la comunicazione asincrona di Ajax sotto forma di push server-side, realizzata aprendo una connessione verso il server e mantenendola appesa finchè il serve stesso non fa il push dei dati quando questi si rendano disponibili. Ciò consente di rendere più efficiente la comunicazione C/S e ridurre il traffico generato dall'approccio del polling, che comporta regolari richieste dal client verso il server per verificare la disponibilità del dato. Il paradigma COMET quindi introduce un ulteriore modello di applicazione Web rispetto a quelli già presentati in precedenza (AJAX - Asynchronous JavaScript and XML).
In questo contesto Jetty 6 entra in gioco in quanto, rispetto ad altri server HTTP, consente di mantenere un elevato numero di connessioni simultanee aperte, utilizzando tecniche di bufferizzazione ad hoc, che in sostanza sospendo opportunamente i Thread che creano connessioni long lived, liberandoli , ottimizzando così le risorse. Approccio noto come delle Continuations.
Nell'articolo di IBM, il meccanismo alla base delle Continuations è mostrato nel dettaglio a livello Thread (il chè non è usuale per un articolo benché tecnico), quindi di grande interesse per il web developer.
Viene infine sviluppata una semplice web application (sistema di tracciamento GPS - incidentalmente mi sono occupato *tempo fa* di una applicazione del genere per il tracciamento su reti Bluetooth-WiFi che utilizzava appunto DWR...;) basata sulle Continuations, e utilizzando l'approccio del Reverse Ajax per effettuare il push delle coordinate GPS provenienti dal tracker server-side Java ai JavaScript client-side attraverso DWR.
Ajax for Java developers: Write scalable Comet applications with Jetty and Direct Web Remoting
IBM DeveloperWorks: http://www.ibm.com/developerworks
Paradigma COMET: http://alex.dojotoolkit.org/?p=545
DWR - Direct Web Remoting: http://getahead.org/dwr
Jetty: http://www.mortbay.org
Jetty - Continuations: http://docs.codehaus.org/display/JETTY/Continuations
JSON: http://json.org
--
LP