Utilisation de Retrofit 2 dans une application Android

Utilisation de Retrofit 2 dans une application Android


Retrofit est une bibliothèque connue des développeurs Android pour le réseautage, certains la considèrent même comme une norme d'une certaine manière. Il y a beaucoup de raisons à cette popularité: la bibliothèque prend parfaitement en charge l'API REST, est facilement testée et configurée, et les requêtes sur le réseau avec son aide sont effectuées très simplement. Dans cet article, je vais vous montrer comment configurer et utiliser Retrofit pour implémenter la mise en réseau avec votre application.


Configurer la modification


Ajoutez la dépendance suivante au fichier build.gradle :


 implementation 'com.squareup.retrofit2:retrofit:2.4.0' 

Nous utiliserons Gson pour convertir JSON en POJO. Retrofit fournit une dépendance qui convertit automatiquement JSON en POJO. Pour ce faire, ajoutez une autre dépendance au fichier build.gradle :


 implementation 'com.squareup.retrofit2:converter-gson:2.3.0' 

Si votre application n'a pas encore été autorisée à fonctionner avec le réseau, assurez-vous d'ajouter la ligne correspondante au fichier AndroidManifest :


 <uses-permission android:name="android.permission.INTERNET"/> 

Une fois les dépendances ajoutées, nous devons écrire du code pour configurer la bibliothèque Retrofit.


Créez une classe appelée NetworkService :


 public class NetworkService { } 

Cette classe doit être un objet singleton, donc déclarez une variable statique et une fonction qui crée et renvoie une variable du même type que la classe. Si vous ne savez pas comment fonctionne ce modèle, consultez cet article , qui contient des exemples d'implémentations en langage Java.


 public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

Pour les tests, nous utilisons le JSONPlaceholder , qui fournit une fausse API REST en ligne pour les développeurs:


 https://jsonplaceholder.typicode.com 

Nous allons maintenant déclarer et initialiser Retrofit dans le constructeur NetworkService :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } } 

La configuration est terminée, nous devons maintenant déterminer les points de terminaison qui renverront des données.


Ajout de points de terminaison


Créez une interface nommée JSONPlaceHolderApi :


 public interface JSONPlaceHolderApi { } 

Sur le site JSONPlaceHolder, URL /posts/id est le point de terminaison qui renvoie un message avec l'identificateur approprié. Ce point de terminaison reçoit une demande GET et renvoie les données au format JSON comme suit:


 { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } 

Tout d'abord, nous allons créer le POJO approprié pour la réponse JSON:


 public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } } 

Comme vous pouvez le voir, il s'agit d'une simple classe POJO. Nous avons annoté les variables à l'aide de @SerializedName() , en y passant le nom. Ces noms sont en fait des clés dans les données JSON renvoyées par l'API, vous pouvez donc changer le nom de variable comme vous le souhaitez, mais assurez-vous que le nom transmis à l'annotation @SerializedName() est exactement présent dans JSON.


Dans l'interface créée ci-dessus, définissez les points de terminaison avec les paramètres requis:


 public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); } 

Puisque nous envoyons une demande GET, nous devons appliquer l'annotation @GET à la méthode, à l'intérieur de laquelle se trouve le point de terminaison auquel nous voulons envoyer la demande. Comme vous pouvez le voir, nous n'ajoutons pas l'URL complète, car Retrofit prendra automatiquement le BASE_URL transmis à la classe NetworkService et l'ajoutera au reste de l'URL.


Le type de retour de la méthode s'appelle Call<Post> . Call est une classe fournie directement par la bibliothèque elle-même. Et toutes les méthodes de l'interface doivent renvoyer des valeurs de ce type. Il s'agit d'une classe générique qui prend le type d'objet que nous voulons convertir en JSON. Nous avons dépassé Post car c'est exactement l'objet dans lequel nous voulons convertir la réponse JSON. Nous avons passé un entier aux paramètres et l' @Path annoté en utilisant @Path , à l'intérieur duquel nous avons écrit id . Retrofit prendra cette valeur et au point de terminaison remplacera {id} . Ainsi, si nous transmettons la valeur 1 en tant que paramètre, le point de terminaison ressemblera à ceci /posts/1 , si nous transmettons la valeur 10, alors le point de terminaison sera /posts/10 .


Nous avons maintenant besoin de Retrofit pour fournir une implémentation de l'interface JSONPlaceHolderApi . Pour ce faire, utilisez la méthode create() :


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

Ensuite, vous devez obtenir le JSONPlaceHolderApi de NetworkService et envoyer une demande:


 NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) { Post post = response.body(); textView.append(post.getId() + "\n"); textView.append(post.getUserId() + "\n"); textView.append(post.getTitle() + "\n"); textView.append(post.getBody() + "\n"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } }); 

L'objet Call retourné contient une méthode appelée enqueue , qui prend Callback<T> comme paramètre. Dans onResponse nous obtenons le résultat Response<Post> contenant l'objet Post renvoyé par le serveur. Pour obtenir l'objet Post lui-même, nous utilisons la méthode response.body() . Le reste du code est compréhensible sans autre explication.


Envoi de différents types de demandes


L'API JSONPlaceHolder possède de nombreux points de terminaison différents que vous pouvez utiliser.


Obtenir une liste de messages


 @GET("/posts") public Call<List<Post>> getAllPosts(); 

Pour obtenir une liste de tous les messages, nous avons changé le point de terminaison et le type de retour de la fonction.


Envoi d'une requête avec paramètre


Si vous souhaitez envoyer une demande avec un paramètre, il vous suffit d'utiliser l'annotation @Query() pour le paramètre correspondant dans la méthode:


 @GET("/posts") public Call<List<Post>> getPostOfUser(@Query("userId") int id); 

Par conséquent, si nous transmettons la valeur 6 dans le paramètre de méthode, le point de terminaison sera ensuite - /posts?userId=6 .


Envoi d'une demande POST


Pour envoyer une requête POST, il vous suffit de modifier l'annotation de la méthode.


 @POST("/posts") public Call<Post> postData(@Body Post data); 

Pour former le corps de la demande pour cette méthode, nous utilisons l'annotation @Body pour le paramètre passé. Retrofit utilisera Gson pour convertir @Body en JSON.


Il existe plusieurs autres types de requêtes que vous pouvez utiliser, mais il s'agit d'un sujet pour un article distinct.


Demande d'interception


Retrofit permet d'intercepter les demandes et de les connecter à Logcat. Mettons en place un intercepteur et regardons cette magie. Ajoutez la dépendance suivante au fichier build.gradle :


 implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0' 

Mettez à jour la classe NetworkService de cette façon:


 public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder client = new OkHttpClient.Builder() .addInterceptor(interceptor); mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client.build()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } } 

Maintenant, lorsque vous envoyez ou recevez une demande, toutes ses données, y compris les URL, les en-têtes et le corps, seront affichées dans le journal:


 D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } <-- END HTTP (292-byte body) 

Ceci conclut notre article. Vous pouvez trouver le code de ce projet sur GitHub .

Source: https://habr.com/ru/post/fr429058/


All Articles