Su piattaforma Android, parlare di servizi Web equivale a parlare di servizi REST. Non è obiettivo di questa guida parlare dei principi base dei servizi REST e delle differenze con i servizi SOAP. Per maggiori informazioni sui concetti base dei REST service si rimanda ad altri altri articoli come questo.
L'SDK di Android contiene ovviamente alcune classi atte a supportare la comunicazione mediante HTTP, alla base dei servizi REST. Esistono ovviamente diverse librerie open source scritte in Java che offrono supporto a tal fine.
La libreria che andremo a vedere in questa guida è una tra le più famose e si chiama Retrofit. Essa consente di accedere ai servizi REST semplicemente decorando con opportune annotazioni i metodi delle interfacce che rappresentano i servizi da utilizzare. Ecco un client REST definito con una delle annotazioni di Retrofit:
public interface UserRestService {
@GET("users")
Call<List<User>> listUsers();
}
In questo codice d'esempio abbiamo definito un metodo GET
per recuperare una lista di oggetti User
.
Retrofit: setup
Per poter utilizzare Retrofit nel suo funzionamento base è sufficiente includere la libreria tra le dipendenze del progetto.
dependencies {
..
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
..
}
Retrofit da sola però non è in grado di gestire la deserializzazione del body
della risposta HTTP, che normalmente contiene l'oggetto o gli oggetti che si richiedono mediante il servizio Web. Retrofit si integra con molte librerie di conversione tra JSON e Java. Tra queste possiamo annoverare anche Kripton che abbiamo visto nei paragrafi precedenti.
Libreria di persistenza | Dipendenza da includere |
---|---|
Kripton | implementation group: 'com.abubusoft', name: 'kripton-retrofit-converter', version: '3.1.0' |
Gson | implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.3.0' |
Jackson | implementation group: 'com.squareup.retrofit2', name: 'converter-jackson', version: '2.3.0' |
Moshi | implementation group: 'com.squareup.retrofit2', name: 'converter-moshi', version: '2.3.0' |
Protobuf | implementation 'com.squareup.retrofit2', name: 'converter-protobuf', version: '2.3.0' |
Wire | implementation group: 'com.squareup.retrofit2', name: 'converter-wire', version: '2.3.0' |
Simple XML | implementation group: 'com.squareup.retrofit2', name: 'converter-simplexml', version: '2.3.0' |
Personalmente ho utilizzato l'integrazione con Kripton e quella con Gson.
Retrofit: esempio d'uso
Per meglio illustrare il funzionamento di Retrofit faremo riferimento ai servizi REST esposti dal sito jsonplaceholder. Nello specifico andiamo a realizzare con Retrofit il client del servizio REST con URI: https://jsonplaceholder.typicode.com/users
Il servizio REST fornisce una risposta JSON simile a quella riportata nell'immagine seguente:
Una possibile rappresentazione mediante classi Java dei dati recuperati dal servizio REST è data dalle seguenti classi (nel codice, per migliorare la leggibilità, sono stati omessi setter e i getter):
public class User {
private String id;
private String phone;
private String username;
private String website;
private Address address;
private String email;
private Company company;
private String name;
}
public class Company {
private String catchPhrase;
private String name;
private String bs;
}
public class Address {
private Geo geo;
private String zipcode;
private String street;
private String suite;
private String city;
}
public class Geo {
private String lng;
private String lat;
}
La definizione del client REST per accedere servizio sopra descritto è data dalla seguente interfaccia
public interface UserRestService {
@GET("users")
Call<List<User>> listUsers();
}
Retrofit per dichiarare un client REST necessita solo dell'interfaccia e all'avvio dell'applicazione è necessario inizializzare la libreria:
// inizializziamo la libreria
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.build();
// istanziamo il client REST
UserService userService = retrofit.create(UserService.class);
L'istanza di Retrofit viene costruita con il pattern builder
, specificando come informazione di minima l'URL di base del server che espone i servizi. Nel caso preso in questione, https://jsonplaceholder.typicode.com/
.