Dopo aver visto come eseguire direttive SQL su database relazionali, in questa lezione ci occupiamo di altre importanti modalità di interazione con diverse sorgenti di dati.
Dialogare con servizi REST
Per interagire con API REST occorre, in primo luogo, gestire un dialogo secondo il protocollo HTTP e, successivamente, interpretare le risposte
fornite dal formato originario che, nel caso di servizi web, è molto spesso JSON.
Per l'accesso a server HTTP esistono in R diverse alternative, tra le quali in questa sede sceglieremo httr.
La si può installare con la funzione già incontrata install.packages
:
install.packages("httr")
Quindi potremo caricarla nell'ambiente di lavoro con library
. Per quanto riguarda il modello REST, httr propone funzioni aventi lo stesso nome dei metodi HTTP: tra gli altri, troviamo infatti GET
, POST
, PUT
e DELETE
.
Proviamone le funzionalità interagendo con un progetto pensato per il testing di librerie per HTTP: JSONbin.io. Si tratta di un contenitore di oggetti JSON che possono essere letti con una richiesta GET
conoscendone l'id (l'indirizzo sarà nel formato https://api.jsonbin.io/b/id) e possono
essere salvati inviando una richiesta POST
all'indirizzo https://api.jsonbin.io/b, accompagnata nel body dall'oggetto JSON che vogliamo salvare. La risposta alla POST
ci fornirà, in caso di successo, l'id della nota salvata.
L'annotazione che vogliamo salvare su JSONbin è questa:
{
"titolo":"Giornata al mare",
"contenuto":"oggi il tempo era bello ed il mare calmo"
}
Lo inviamo al server con una richiesta POST
:
> library("httr")
> resp <- POST("http://api.jsonbin.io/b",
body=list("titolo"="Giornata al mare", "contenuto"="oggi il tempo era bello ed il mare calmo"),
encode="json")
Tramite httr abbiamo inviato un body descritto sotto forma di lista specificando la codifica JSON. Dall'oggetto resp
potremo estrapolare vari dati usando specifiche funzioni:
status_code(resp)
: il codice di ritorno HTTP dove ci aspetteremo un valore pari a 200 in caso di successo;headers(resp)
: per ottenere le intestazioni HTTP della risposta;content(resp)
: che offrirà il contenuto del pacchetto tra cui anche l'id della nuova nota creata. In questo caso, potrebbe capitare che httr chieda l'installazione di ulteriori packages per la corretta interpretazione del payload della risposta, come xml2, ed in tal caso sarà sufficiente procedere come di consueto coninstall.packages
.
La nota da noi creata per questo esempio ha id "596d36b70f7bd67efd2a1f1e" e potremo procedere alla sua lettura mediante una richiesta GET. Questa una breve sessione di prova:
> r <- GET("https://api.jsonbin.io/b/596d36b70f7bd67efd2a1f1e")
> status_code(r)
[1] 200
> nota <- content(r)
> nota
$contenuto
[1] "oggi il tempo era bello ed il mare calmo"
$titolo
[1] "Giornata al mare"
> nota$titolo
[1] "Giornata al mare"
Con queste operazioni, dimostriamo non solo come sia rapido leggere dati via GET
ma anche come si possa fare agevolmente accesso ad ogni loro aspetto.