Ce tutoriel va vous montrer comment mettre en place une requete HTTP GET, en utilisant la bibliothèque Retrofit, via Kotlin.
Importation des bibliothèques nécessaires
Dans le fichier gradle du projet, importer la dépendance Retrofit, plus un convertisseur json, en l’occurence le convertisseur gson :
dependencies { // ... // Retrofit implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_gson_converter" }
Ajouter les droits pour se connecter à Internet
Dans le fichier manifest du projet ajouter la ligne suivante :
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxx.xxxxxx">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:....
...
</application>
</manifest>
Création de la classe Kotlin permettant de représenter les données récupérées
Pour l’exemple, nous allons utiliser le webservice permettant de récupérer la liste des arrêts de la TAN (Transports de l’agglomération nantaise). Ce webservice va nous retourner un json de ce genre :
[ {"codeLieu":"OTAG", "libelle":"50 Otages", "distance":null, "ligne":[{"numLigne":"2"},{"numLigne":"C2"},{"numLigne":"12"},{"numLigne":"23"}]}, {"codeLieu":"MAI8", "libelle":"8 Mai", "distance":null, "ligne":[{"numLigne":"2"},{"numLigne":"3"},{"numLigne":"97"},{"numLigne":"98"}]} // ... ]
Nous allons donc créer la classe suivante en s’appuyant sur les données reçues ci-dessus :
class TanStop { var codeLieu: String? = null var libelle: String? = null var distance: String? = null var numerosLigne: List<String>? = null var latitude: String? = null var longitude: String? = null }
Création de l’Interface représentant l’API
import fr.sebastienlaunay.androidkotlinretrofit1.model.TanStop import retrofit2.Call import retrofit2.http.GET interface ITanApi { @GET("ewp/arrets.json") fun getTanStops(): Call<List<TanStop>> }
L’annotation @GET de retrofit permet de déclarer, comme son nom l’indique, une requete GET. En paramètre est placé le chemin de la requete, sachant que l’on va voir l’URL de base un peu plus loin.
Création de l’instance retrofit
Depuis une activité, nous allons créer l’instance retrofit
private val tanUrl = "http://xxx.xxxx.xx" val retrofit = Retrofit.Builder() .baseUrl(tanUrl) .addConverterFactory(GsonConverterFactory.create()) .build()
Le client retrofit doit être configuré avec une url serveur ainsi qu’un convertisseur de requête. Ce convertisseur va permettre de convertir automatiquement la requete json en objets. Ici, nous utilisons le convertisseur Gson.
Création de l’instance du service
Après avoir créé l’instance retrofit, nous allons créer l’instance du service comme ceci :
val service = retrofit.create(ITanApi::class.java)
Ce service est créé à partir du client Retrofit, lequel contient l’url du serveur, et à partir du .class
de l’interface, laquelle contient toutes les requêtes possibles avec le serveur.
Création de la requêt GET
Nous allons maintenant créer la requête permettant de faire le GET
val tanStops = service.getTanStops()
Exécution de la requête
Nous allons maintenant exécuter la requête
tanStops.enqueue(object: Callback<List<TanStop>> { override fun onResponse(call: Call<List<TanStop>>, response: Response<List<TanStop>>) { val allTanStop = response.body() allTanStop?.let { for( tanStop in it) { Log.d("TAN","Arret Tan ${tanStop.libelle}") } } } override fun onFailure(call: Call<List<TanStop>>, t: Throwable) { Log.e("TAN", "Error : $t") } })
La fonction enqueue(object: Callback<…>) prend en paramètre l’objet Callback.
Cet objet intercepte la réponse du serveur. Cette dernière est traitée dans la sur-implémentation des fonctions onResponse(...)
et onFailure(...)
.
Les paramètres du Callback ainsi que des fonctions onResponse(…) et onFailure(…) dépendent directement du type de retour de la fonction représentant la requête.
Dans notre cas, le type de retour est List<TanStop>. Cette liste est dans response.body()
Vous trouverez le projet android correspondant à cet article sur le lien suivant.