Il 21 Aprile 2010, in occasione dell'evento F8 Live, Facebook ha presentato una serie di novità riguardanti il modo di sviluppare applicazioni per il social network. Le più importanti riguardano la gestione delle autorizzazioni, che da adesso si baseranno sul paradigma OAuth 2.0, (uno standard aperto a cui, oltre Facebook hanno collaborato Yahoo, Google e Twitter) e la presentazione di tre nuovi SDK, uno per Javascript, uno per Python e anche per PHP. Con i nuovi SDK sono state presentate anche le nuove API, chiamate Graph API.
Sebbene concettualmente il concetto di Graph API sia completamente diverso da quello della API REST, a livello applicativo non ci sono particolari differenze implementative, per cui l'esperienza accumulata programmando con le vecchie API ci sarà certamente utile. L'altra buona notizia è che le API REST non verranno sostituite da queste nuove, quindi tutti i nostri progetti REST continueranno a funzionare senza dover mettere mano al codice.
Le Graph Api
I grafi sono delle strutture matematiche, composte da elementi detti nodi (o vertici) connessi tra loro da archi (o lati). Tali strutture estendono il loro campo di applicazione non limitandosi alla sola matematica ma toccando anche branche della sociologia, fino a Facebook.
L'idea dietro queste nuove API, infatti, è quella di considerare elementi quali utenti, pagine fan, gruppi, foto e video come nodi di un grafo (oggetti nella rivisitazione fatta da Facebook). Tutti questi nodi sono poi collegati tra loro tramite archi (o connessioni nel gergo Facebook). Ad esempio, dal nodo user, partono le connessioni friends, che collegano ogni utente ad altri utenti (i suoi amici) o le connessioni likes, che legano un utente alle pagine per cui ha espresso apprezzamento cliccando "Mi piace". Per vedere le connessioni di un oggetto basta andare nella pagina di documentazione di quell'oggetto, come ad esempio la pagina dell'oggetto user.
Il primo cambiamento evidente è che adesso le risposte API sono solo in formato JSON ed inoltre sarà possibile richiamarle tramite URL. Ad esempio, se volessimo ottenere le informazioni sulla pagina di HTML.it contatteremo http://graph.facebook.com/html.it che ci risponderà qualcosa del genere:
{
"id": "93192098615",
"name": "HTML.it",
"picture": "http://profile.ak.fbcdn.net/object3/1973/91/s93192098615_1669.jpg",
"link": "http://www.facebook.com/HTML.it",
"category": "Websites",
"username": "HTML.it",
"company_overview": "HTML.it u00e8 il sito italiano [...] community di professionisti IT.",
"fan_count": 21834
}
Questo è il JSON di risposta da parte di Facebook, ci comunica l'id unico della pagina, il link all'immagine del profilo e altre informazioni, come la descrizione della compagnia e il numero di fan. Grazie alle connessioni possiamo anche vedere quali sono i messaggi scritti da HTML.it, ci basterà dare http://graph.facebook.com/html.it/posts e il server ci risponderà con i messaggi più recenti:
{
"data": [
{
"id": "93192098615_125366847473821",
"from": {
"name": "HTML.it",
"category": "Websites",
"id": "93192098615"
},
"message": "Sono molto pochi [...]vediamo come.",
"picture": "http://external.ak.fbcdn.net/safe_image.php?...scan_report.jpg",
"link": "https://download.html.it/howto/leggi/45/ripristinare-un-pc-infetto-con-avg-rescue-cd/",
"name": "Ripristinare un PC infetto con AVG Rescue CD | Come fare per ... | Download.HTML.it",
"caption": "download.html.it",
"description": "Utilitu00e0 per il ripristino di computer",
"icon": "http://static.ak.fbcdn.net/rsrc.php/zB010/hash/9yvl71tw.gif",
"created_time": "2010-05-06T13:04:12+0000",
"updated_time": "2010-05-06T13:04:12+0000",
"likes": 10
}, // altri messaggi
] }
In modo del tutto simile possiamo ottenere informazioni sull'oggetto users e sulle sue connessioni. Interrogando http://graph.facebook.com/zuck avremo in risposta le informazioni dal profilo del creatore di Facebook, Mark Zuckerberg. Abbiamo anche una scorciatoia me, che punta sempre all'utente attivo, richiamando http://graph.facebook.com/me dovremmo ottenere le informazioni dal nostro profilo come nome, data di nascita... invece:
{
"error": {
"type": "QueryParseException",
"message": "An active access token must be used to query information about the current user."
}
}
Questo accade perché alcune chiamate API per motivi di sicurezza hanno bisogno di un token per essere autenticate e produrre un output che non sia un errore. Per ottenere un token bisogna richiedere un codice d'autorizzazione che poi rimanderemo al server che ci risponderà a sua volta con un token valido.
La prima cosa da fare sarà entrare nella scheda Connettit del pannello di controllo dell'applicazione (a partire da http://www.facebook.com/developers/apps.php fate clic su Modifica il Profilo dell'Applicazione e poi su Impostazioni applicazioni), qui nella casella "Connetti URL" specificheremo un indirizzo di ritorno. Questo indirizzo deve puntare ad una directory sul nostro server e deve terminare quindi con un simbolo slash '/'. Ad esempio http://www.miohost/connect/miaDirectory/. All'interno di miaDirectory creeremo un file index.php. Siccome quello che segue è il procedimento manuale possiamo lasciare index.php vuoto.
Una volta compiuti, i passi di sopra non verranno più ripetuti. Invece, da ora in poi, ogni volta che desideriamo ottenere un token accederemo col nostro browser a questo link:
https://graph.facebook.com/oauth/authorize?client_id=APP_ID&redirect_uri=http://www.miohost/connect/miaDirectory/
Al parametro client_id è necessario passare l'identificativo con cui la nostra applicazione è registrata su Facebook, mentre invece all'interno di redirect_uri inseriremo il path passato nella casella "Connetti URL" del pannello impostazioni (importante che tale parametro termini con '/' esattamente come specificato in "Connetti URL"). Cliccato "Invio" ci renderemo conto di essere all'indirizzo:
http://www.miohost/connect/miaDirectory/?code=xyz
Grazie alle informazioni contenute in redirect_uri, infatti, siamo stati rindirizzati ad un spazio di nostra proprietà su cui abbiamo libertà di agire. Se non avessimo creato il file index.php, il link superiore ci avrebbe risposto con un errore 404 (file non trovato). Adesso possiamo copiare la stringa xyz rappresentata da code e incollarla in una nuova chiamata URL così composta (la scomponiamo per comodità):
https://graph.facebook.com/oauth/access_token ?client_id=[APP_ID] &redirect_uri=http://www.miohost/connect/miaDirectory/ &code=xyz &client_secret=[SECRET_ID]
Tutti i parametri sono noti, client_secret è il codice segreto che ci viene fornito al momento della registrazione dell'applicazione (lo vedremo più avanti nella guida), invieremo questo link e in risposta avremo il nostro token. Questo è un generico formato di risposta: access_token=abc&expires=3581.
La stringa abc in realtà è molto più lunga e complessa, expires riguarda il periodo di validità del token e salvo esigenze particolari non è utile modificarne il valore. Adesso, non ci resterà altro che copiare la stringa che ci viene restituita e concatenarla alla richiesta API che prima ci restituiva errore, in questo modo:
http://graph.facebook.com/me?access_token=abc&expires=3581
Questo esempio chiude questa lezione introduttiva sulle nuove API. È stato mostrato il concetto dietro le nuove API, come fare per interrogarle al meglio e come gestire il meccanismo delle autenticazioni. Ovviamente, le potenzialità non si esauriscono all'interno di questa guida, ma basterà consultare la pagina della documentazione ufficiale per integrare il tutto.