Android Une demande GET simple


Exemple

Nous allons montrer comment faire une requête GET vers une API qui répond avec un objet JSON ou un tableau JSON . La première chose à faire est d’ajouter les dépendances Retrofit et GSON Converter au fichier de dégradé de notre module.

Ajoutez les dépendances pour la bibliothèque de rattrapage comme décrit dans la section Remarques.

Exemple d'objet JSON attendu:

{
    "deviceId": "56V56C14SF5B4SF",
    "name": "Steven",
    "eventCount": 0
}

Exemple de tableau JSON:

[
    {
        "deviceId": "56V56C14SF5B4SF",
        "name": "Steven",
        "eventCount": 0
    },
    {
        "deviceId": "35A80SF3QDV7M9F",
        "name": "John",
        "eventCount": 2
    }
]

Exemple de classe de modèle correspondante:

public class Device
{
    @SerializedName("deviceId")
    public String id;

    @SerializedName("name")
    public String name;

    @SerializedName("eventCount")
    public int eventCount;
}

Les annotations @SerializedName proviennent de la bibliothèque GSON et nous permettent de serialize et deserialize cette classe en JSON utilisant le nom sérialisé comme clé. Maintenant, nous pouvons créer l'interface pour l'API qui va récupérer les données du serveur.

public interface DeviceAPI
{
    @GET("device/{deviceId}")
    Call<Device> getDevice (@Path("deviceId") String deviceID);

    @GET("devices")
    Call<List<Device>> getDevices();
}

Il se passe beaucoup de choses ici dans un espace assez compact, alors nous allons le décomposer:

  • L'annotation @GET provient de Retrofit et indique à la bibliothèque que nous définissons une requête GET.
  • Le chemin entre parenthèses est le point final que notre requête GET doit atteindre (nous définirons l’URL de base un peu plus tard).
  • Les accolades nous permettent de remplacer des parties du chemin au moment de l’exécution pour que nous puissions passer des arguments.
  • La fonction que nous définissons s'appelle getDevice et prend l'identifiant de périphérique que nous voulons comme argument.
  • L'annotation @PATH indique à Retrofit que cet argument doit remplacer l'espace réservé "deviceId" dans le chemin.
  • La fonction renvoie un objet Call de type Device .

Création d'une classe wrapper:

Nous allons maintenant créer une petite classe wrapper pour notre API afin de conserver le code d'initialisation Retrofit bien intégré.

public class DeviceAPIHelper
{
    public final DeviceAPI api;

    private DeviceAPIHelper ()
    {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        api = retrofit.create(DeviceAPI.class);
    }
}

Cette classe crée une instance GSON pour pouvoir analyser la réponse JSON, crée une instance Retrofit avec notre URL de base et un GSONConverter, puis crée une instance de notre API.

Appel de l'API:

// Getting a JSON object
Call<Device> callObject = api.getDevice(deviceID);
callObject.enqueue(new Callback<Response<Device>>()
{
    @Override
    public void onResponse (Call<Device> call, Response<Device> response)
    {
        if (response.isSuccessful()) 
        {
           Device device = response.body();
        }
    }

    @Override
    public void onFailure (Call<Device> call, Throwable t)
    {
        Log.e(TAG, t.getLocalizedMessage());
    }
});

// Getting a JSON array
Call<List<Device>> callArray = api.getDevices();
callArray.enqueue(new Callback<Response<List<Device>>()
{
    @Override
    public void onResponse (Call<List<Device>> call, Response<List<Device>> response)
    {
        if (response.isSuccessful()) 
        {
           List<Device> devices = response.body();
        }
    }

    @Override
    public void onFailure (Call<List<Device>> call, Throwable t)
    {
        Log.e(TAG, t.getLocalizedMessage());
    }
});

Cela utilise notre interface API pour créer un objet Call<Device> et pour créer un Call<List<Device>> respectivement. L'appel de enqueue indique à Retrofit de faire cet appel sur un thread d'arrière-plan et de renvoyer le résultat au rappel que nous créons ici.

Remarque: L' analyse d'un tableau JSON d'objets primitifs (tels que String, Integer, Boolean et Double ) est similaire à l'analyse d'un tableau JSON. Cependant, vous n'avez pas besoin de votre propre classe de modèle. Vous pouvez obtenir le tableau de chaînes par exemple en utilisant le type de retour de l'appel comme Call<List<String>> .