Per poter accedere alla API di YouTube é necessario ottenere un Developer ID e la documentazione é abbastanza completa, anche se mi aspettavo qualche metodo in più. Le metodologie di accesso sono due: REST e XML-RPC.
Obiettivo del post é fare una panoramica di come implementare una classe Java che, dati DEV_ID e una lista di VIDEO_ID, acceda alle API di YouTube, ne scarichi i dettagli, provveda a costruire una cache su filesystem. Non entrerò in dettagli che uno sviluppatore Java conosce sicuramente meglio di me.
Metologie di caching:
- la più semplice in Java é serializzare l’oggetto ottenuto dall’XML su filesystem;
- per palati più raffinati, si possono utilizzare ottime librerie open source come
REST Interface
Interfaccia estremamente semplice si basa su una chiamata http che come risultato restituisce un file xml. Un esempio.
http://www.youtube.com/api2_rest?
method=youtube.videos.get_details&dev_id=YOUR_DEV_ID
&video_id=YOUR_VIDEO_ID
dove:
- method é il parametro in cui si indica il metodo delle API YouTube a cui si vuole accedere;
- dev_id il proprio id di sviluppo;
- video_id é l’id univoco del filmato su YouTube.
La nostra classe:
- scorre la lista di VIDEO_ID;
- verifica se esiste già una cache per quel video (o verificando su filesystem se esiste l’oggetto serializzato o interroganto EHCache/OScache);
- se non esiste una cache:
- farà la chiamata http alle API di YouTube
- riceverà l’xml di dettaglio del video per quel determinato VIDEO_ID
- elaborerà l’xml trasformandolo in un oggetto strutturato nel modo che ci viene più comodo e utile
- creerà la cache per quell’oggetto
- se esiste l’oggetto cachato, la classe si preoccuperà soltanto di recuperarlo;
- viene restituita una lista di oggetti contenenti i dettagli dei nostri video.
Per effettuare una chiamata http é necessaria una libreria che implementi un client http, va benissimo l’HttpClient del progetto Jakarta Commons. La chiamata può essere fatta in GET o in POST: in questo senso la documentazione di YouTube non dice nulla (l’esempio sopra simula una GET) ma penso che l’API accetti entrambi i metodi (preferibile il POST).
Il codice (plausibilmente un metodo privato della classe) dovrà essere strutturato più o meno così:
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(”http://www.youtube.com/api2_rest”);
method.addParameter(”method”, “youtube.videos.get_details”);
method.addParameter(”dev_id”, YOUR_DEV_ID);
method.addParameter(”video_id”, YOUR_VIDEO_ID);
try {
// eseguo la chiamata
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println(”Method failed: ” + method.getStatusLine());
}
// leggo la risposta
byte[] responseBody = method.getResponseBody();
// utilizzo la response.
// Attenzione: assicurarsi che l’encoding sia corretto ne non siano dati binari
String myXML = new String(responseBody));
} catch (HttpException e) {
… // gestione dell’eccezione
} catch (IOException e) {
… // gestione dell’eccezione
} finally {
// chiudo la connessione.
method.releaseConnection();
}
Le possibilità di ottimizzazione sono svariate, come per esempio creare un unico client e sfruttare un’unica connessione per evitare overhead inutili: a voi la scelta. La response che si otterrà sarà simile a questa.
Per elaborare l’xml e trasformarlo in un più comodo oggetto, possiamo utilizzare uno dei moltissimi parser a disposizione della piattaforma Java. La scelta in questo caso é più orientata su considerazioni di gusto (riguardo l’API del parser), di leggerezza del parser e della sua velocità di elaboarzione.
Per un utilizzo leggero e snello consiglio di utilizzare un pull-parser anche senza feature di validazione (che in questo caso servono a poco e non avremmo comunque il DTD su cui lavorare). Un elenco veloce di alcuni:
Alla prossima puntata farò una panoramica su come può funzionare l’approccio via interfaccia XML-RPC.