Exemple de tutoriel de rétrofit Android

Bienvenue dans le didacticiel sur l’exemple de Retrofit Android. Aujourd’hui, nous utiliserons la bibliothèque Retrofit développée par Square pour gérer les appels d’API REST dans notre application Android.

Retrofit Android

Retrofit est un client REST sûr pour Android et Java qui vise à faciliter la consommation de services web RESTful. Nous n’entrerons pas dans les détails des versions 1.x de Retrofit et passerons directement à Retrofit 2, qui présente de nombreuses nouvelles fonctionnalités et une API interne modifiée par rapport aux versions précédentes. Retrofit 2 utilise par défaut OkHttp comme couche de réseau et est construit par-dessus. Retrofit sérialise automatiquement la réponse JSON à l’aide d’un POJO (Plain Old Java Object) qui doit être défini à l’avance pour la structure JSON. Pour sérialiser JSON, nous avons besoin d’un convertisseur pour le convertir d’abord en Gson. Nous devons ajouter les dépendances suivantes dans notre fichier build.grade.

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

La dépendance OkHttp est déjà incluse avec la dépendance Retrofit 2. Si vous souhaitez utiliser une dépendance OkHttp distincte, vous devez exclure la dépendance OkHttp de Retrofit 2 comme suit :

compile ('com.squareup.retrofit2:retrofit:2.1.0') {  
  // exclure le module de dépendance OkHttp de Retrofit et définir votre propre importation de module
  exclude module: 'okhttp'
}
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.okhttp3:okhttps:3.4.1'
  • Le logging-interceptor génère une chaîne de journal de toute la réponse renvoyée.
  • Il existe d’autres convertisseurs pour analyser le JSON vers le type nécessaire. Quelques-uns d’entre eux sont énumérés ci-dessous.
  1. Jackson : com.squareup.retrofit2:converter-jackson:2.1.0
  2. Moshi : com.squareup.retrofit2:converter-moshi:2.1.0
  3. Protobuf : com.squareup.retrofit2:converter-protobuf:2.1.0
  4. Wire : com.squareup.retrofit2:converter-wire:2.1.0
  5. Simple XML : com.squareup.retrofit2:converter-simplexml:2.1.0

Ajoutez l’autorisation d’accéder à Internet dans le fichier AndroidManifest.xml.

Intercepteurs OkHttp

Les intercepteurs sont un mécanisme puissant présent dans OkHttp qui peut surveiller, réécrire et réessayer les appels. Les intercepteurs peuvent être principalement divisés en deux catégories :

  • Intercepteurs d’application : Pour enregistrer un intercepteur d’application, nous devons appeler addInterceptor() sur OkHttpClient.Builder
  • Intercepteurs réseau : Pour enregistrer un intercepteur réseau, invoquez addNetworkInterceptor() au lieu de addInterceptor()

Configuration de l’interface Retrofit

package com.journaldev.retrofitintro;

import com.journaldev.retrofitintro.pojo.MultipleResource;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

class APIClient {

    private static Retrofit retrofit = null;

    static Retrofit getClient() {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();


        retrofit = new Retrofit.Builder()
                .baseUrl("https://reqres.in")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();



        return retrofit;
    }

}

La méthode getClient() dans le code ci-dessus sera appelée chaque fois lors de la configuration d’une interface Retrofit. Retrofit fournit une liste d’annotations pour chacune des méthodes HTTP : @GET, @POST, @PUT, @DELETE, @PATCH ou @HEAD. Voyons à quoi ressemble notre classe APIInterface.java.

package com.journaldev.retrofitintro;

import com.journaldev.retrofitintro.pojo.MultipleResource;
import com.journaldev.retrofitintro.pojo.User;
import com.journaldev.retrofitintro.pojo.UserList;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

interface APIInterface {

    @GET("/api/unknown")
    Call<MultipleResource> doGetListResources();

    @POST("/api/users")
    Call<User> createUser(@Body User user);

    @GET("/api/users?")
    Call<UserList> doGetUserList(@Query("page") String page);

    @FormUrlEncoded
    @POST("/api/users?")
    Call<UserList> doCreateUserWithField(@Field("name") String name, @Field("job") String job);
}

Dans la classe ci-dessus, nous avons défini quelques méthodes qui effectuent des requêtes HTTP avec des annotations. @GET("/api/unknown") appelle doGetListResources();. doGetListResources() est le nom de la méthode. MultipleResource.java est une classe de modèle POJO pour notre objet de réponse qui est utilisée pour mapper les paramètres de réponse à leurs variables respectives. Ces classes POJO agissent comme le type de retour de la méthode. Une classe POJO simple pour MultipleResources.java est donnée ci-dessous.

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

public class MultipleResource {

    @SerializedName("page")
    public Integer page;
    @SerializedName("per_page")
    public Integer perPage;
    @SerializedName("total")
    public Integer total;
    @SerializedName("total_pages")
    public Integer totalPages;
    @SerializedName("data")
    public List<Datum> data = null;

    public class Datum {

        @SerializedName("id")
        public Integer id;
        @SerializedName("name")
        public String name;
        @SerializedName("year")
        public Integer year;
        @SerializedName("pantone_value")
        public String pantoneValue;

    }
}

L’annotation @SerializedName est utilisée pour spécifier le nom du champ qui se trouve dans la réponse JSON. Prévisualisez la classe POJO et copiez-la dans la structure de votre projet Android Studio. Les classes POJO sont encapsulées dans une classe Retrofit typée Call. Note: Un JSONArray est sérialisé en une liste d’objets dans les classes POJO Paramètres de méthode : Il existe une grande variété d’options possibles de paramètres à passer à l’intérieur d’une méthode :

  • @Body – Envoie des objets Java en tant que corps de requête.
  • @Url – utilise des URL dynamiques.
  • @Query – Nous pouvons simplement ajouter un paramètre de méthode avec @Query et un nom de paramètre de requête, décrivant le type. Pour encoder une requête, utilisez le formulaire : @Query(value = "auth_token", encoded = true) String auth_token
  • @Field – Envoyer des données sous forme de formulaire encodé. Cela nécessite une annotation @FormUrlEncoded attachée à la méthode. Le paramètre @Field fonctionne uniquement avec un POST

Remarque: @Field nécessite un paramètre obligatoire. Dans les cas où @Field est facultatif, nous pouvons utiliser @Query à la place et passer une valeur nulle.

Structure du Projet Exemple Retrofit Android

Le package pojo définit quatre classes de modèle pour chacune des réponses de point de terminaison API définies dans la classe APIInterface.java. User.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName("name")
    public String name;
    @SerializedName("job")
    public String job;
    @SerializedName("id")
    public String id;
    @SerializedName("createdAt")
    public String createdAt;

    public User(String name, String job) {
        this.name = name;
        this.job = job;
    }


}

La classe ci-dessus est utilisée pour créer le corps de réponse de la méthode createUser() UserList.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

public class UserList {

    @SerializedName("page")
    public Integer page;
    @SerializedName("per_page")
    public Integer perPage;
    @SerializedName("total")
    public Integer total;
    @SerializedName("total_pages")
    public Integer totalPages;
    @SerializedName("data")
    public List<Datum> data = new ArrayList();

    public class Datum {

        @SerializedName("id")
        public Integer id;
        @SerializedName("first_name")
        public String first_name;
        @SerializedName("last_name")
        public String last_name;
        @SerializedName("avatar")
        public String avatar;

    }
}

CreateUserResponse.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

public class CreateUserResponse {

    @SerializedName("name")
    public String name;
    @SerializedName("job")
    public String job;
    @SerializedName("id")
    public String id;
    @SerializedName("createdAt")
    public String createdAt;
}

Le MainActivity.java est l’endroit où nous appelons chacun des points d’API définis dans la classe Interface et affichons chacun des champs dans un Toast/TextView.

package com.journaldev.retrofitintro;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.journaldev.retrofitintro.pojo.CreateUserResponse;
import com.journaldev.retrofitintro.pojo.MultipleResource;
import com.journaldev.retrofitintro.pojo.User;
import com.journaldev.retrofitintro.pojo.UserList;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    TextView responseText;
    APIInterface apiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        responseText = (TextView) findViewById(R.id.responseText);
        apiInterface = APIClient.getClient().create(APIInterface.class);


        /**
         GET List Resources
         **/
        Call<MultipleResource> call = apiInterface.doGetListResources();
        call.enqueue(new Callback<MultipleResource>() {
            @Override
            public void onResponse(Call<MultipleResource> call, Response<MultipleResource> response) {


                Log.d("TAG",response.code()+"");

                String displayResponse = "";

                MultipleResource resource = response.body();
                Integer text = resource.page;
                Integer total = resource.total;
                Integer totalPages = resource.totalPages;
                List<MultipleResource.Datum> datumList = resource.data;

                displayResponse += text + " Page\n" + total + " Total\n" + totalPages + " Total Pages\n";

                for (MultipleResource.Datum datum : datumList) {
                    displayResponse += datum.id + " " + datum.name + " " + datum.pantoneValue + " " + datum.year + "\n";
                }

                responseText.setText(displayResponse);

            }

            @Override
            public void onFailure(Call<MultipleResource> call, Throwable t) {
                call.cancel();
            }
        });

        /**
         Create new user
         **/
        User user = new User("morpheus", "leader");
        Call<User> call1 = apiInterface.createUser(user);
        call1.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                User user1 = response.body();

                Toast.makeText(getApplicationContext(), user1.name + " " + user1.job + " " + user1.id + " " + user1.createdAt, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                call.cancel();
            }
        });

        /**
         GET List Users
         **/
        Call<UserList> call2 = apiInterface.doGetUserList("2");
        call2.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {

                UserList userList = response.body();
                Integer text = userList.page;
                Integer total = userList.total;
                Integer totalPages = userList.totalPages;
                List<UserList.Datum> datumList = userList.data;
                Toast.makeText(getApplicationContext(), text + " page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_SHORT).show();

                for (UserList.Datum datum : datumList) {
                    Toast.makeText(getApplicationContext(), "id : " + datum.id + " name: " + datum.first_name + " " + datum.last_name + " avatar: " + datum.avatar, Toast.LENGTH_SHORT).show();
                }


            }

            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                call.cancel();
            }
        });


        /**
         POST name and job Url encoded.
         **/
        Call<UserList> call3 = apiInterface.doCreateUserWithField("morpheus","leader");
        call3.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {
                UserList userList = response.body();
                Integer text = userList.page;
                Integer total = userList.total;
                Integer totalPages = userList.totalPages;
                List<UserList.Datum> datumList = userList.data;
                Toast.makeText(getApplicationContext(), text + " page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_SHORT).show();

                for (UserList.Datum datum : datumList) {
                    Toast.makeText(getApplicationContext(), "id : " + datum.id + " name: " + datum.first_name + " " + datum.last_name + " avatar: " + datum.avatar, Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                call.cancel();
            }
        });

    }
}

apiInterface = APIClient.getClient().create(APIInterface.class); est utilisé pour instancier APIClient. Pour mapper la classe Modèle à la réponse, nous utilisons: MultipleResource resource = response.body(); L’exécution de l’application appellerait chacun des points d’extrémité et afficherait un message Toast pour chacun d’eux en conséquence. Cela met fin à l’exemple de tutoriel Android Retrofit. Vous pouvez télécharger le projet d’exemple Android Retrofit à partir du lien ci-dessous.

Télécharger le projet d’exemple Android Retrofit

Source:
https://www.digitalocean.com/community/tutorials/retrofit-android-example-tutorial