AndroidKotlin

Kotlin – Utilisation de retrofit

By 12 novembre 2018 No Comments

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.

Leave a Reply