Construire une API REST avec Spring Boot

Déjà la fameuse question, c’est quoi une API REST ?

Pour commencer, une API (Interface de Programmation d’Application) est un programme qui permet de communiquer avec d’autres programmes facilitant ainsi la création et l’intégration de logiciels d’application et l’acronyme REST (REpresentation State Tranfer) permet simplement de dire que l’API en question respectera les contraintes du style d’architecture REST.

Dans ce tutoriel, nous allons concevoir pas à pas une API REST avec le très célèbre SPRINGBOOT

Ah oui j’oubliais, vous allez me demander C’est quoi SPRING BOOT ?

Spring Boot est un framework (ensemble d’outils de programmation regroupés ensemble et dont le but est de permettre la réalisation de l’application) JAVA très populaire avec lequel on peut réaliser des applications très complète avec peu de configuration c’est-à-dire qu’avec spring boot, le développement est quasi inexistant (cela dépends bien sûr de la taille du projet mais vous m’avez compris je pense) et cela est un plus car ça facilite et optimise grandement le travail.

Dans ce tutoriel, je vous montrerai comment concevoir une api rest très facile et en partant sur un exemple concret de gestion de d’article.

Bon tout est dit, entrons dans le vif du sujet maintenant.

Configuration de l’environnement de travail

Comme d’habitude, avec de nous lancer corps et âme dans le code, il nous faut installer un minimum de dépendance nécessaire au bon fonctionnement du tutoriel.

Donc pour ce tutoriel, nous aurons besoin d’installer l’environnement Java sur nôtre PC et un IDE qui nous permettra de run nos projets JAVA.

  1. Installation de JAVA:

Pour installer l’environnement JAVA sur un PC, il faut installer le JDK (Java Development Kit) qui est un ensemble d’outils dont le développeur a besoin pour développer des logiciels basés sur Java. Pour ce faire veillez-vous rendre sur le site d’oracle à ce lien https://www.oracle.com/java/technologies/downloads/ pour le télécharger et une fois téléchargé, l’installation est assez facile, il vous suffira juste de cliquer plusieurs fois sur NEXT et le tour est joué du moins en partie.

Je ne vous montre pas de capture de l’installation ici parce que moi j’ai déjà JDK installé sur mon pc.

Maintenant, il faut configurer java dans les variables d’environnements. Donc tout d’abord rendez-vous sur l’espace aide de la barre de tache de votre PC et saisissez « variable d’environnement » et là vous devriez avoir une option « modifier les variables d’environnement système ». Cliquer dessus et si tout se passe bien vous devriez avoir cette fenêtre affichée.

Cliquez ensuite sur « variables d’environnement » et vous aurez :

Cliquer ensuite sur path (chemin en français) puis sur « modifier » et vous aurez cette fenêtre :

Arrivé à cette étape, l’objectif est d’ajouter le chemin d’accès au JDK dans cette liste et pour ce faire, il vous faut allez le copier sur son emplacement.

Donc ouvrez votre « explorateur de fichiers » et rendez-vous dans le « disque local C ». Une fois à l’intérieur, cliquer sur le dossier « programmes », puis sur le dossier « java », puis sur le dossier « JDK » et enfin sur le dossier « bin ». Vous devriez avoir cette arborescence :

Une fois effectué, copiez cette arborescence et revenez sur votre interface de configuration des variables d’environnement et cliquez sur nouveau pour ajouter un nouveau chemin et coller l’arborescence copiée plus haut :

Après avoir cliqué sur « ok », vous allez maintenant cliquer sur « nouvelle variables… » pour ajouter une nouvelle variable d’environnement. Vous devrez là configurer ainsi :

Ensuite cliquer sur « ok » jusqu’à la fermeture de la première fenêtre ouverte concernant les variables d’environnement.

Maintenant pour vérifier si java est bien installé dans votre pc, il faut vous rendre en « invite de commande » et taper la commande « java –version » et si tout se passe bien vous aurez un écran similaire :

        2. Installation d’Eclipse

L’installation d’Eclipse est extrêmement facile. Il suffit juste d’aller sur le site d’Eclipse (eh oui encore eux !!!)  plus précisément sur le lien Téléchargement https://www.eclipse.org/downloads/ et là il vous suffira juste de cliquer sur téléchargement et une fois le téléchargement fini, il vous suffira de cliquer juste sur NEXT plusieurs fois (comme pour java) et le tour sera une fois de plus joué.

Pour des raisons évidentes, nous n’allons pas expliquer l’interface complète de l’IDE, nous partirons donc du fait que l’interface est facile à utiliser et du coup, entrons sans plus tarder dans le CONCRET (Je sais, je me répète un peu !!!).

Création d’un projet SPRING BOOT

Pour créer un projet spring boot, la méthode la plus facile est d’aller sur le site https://start.spring.io/ en saisissant dans votre navigateur « spring initializr ».

Vous devriez avoir cette interface :

Pour faire vite sur l’interface :

  • Sur l’option « Project»t il faudra choisir *Maven*
  • Sur l’option « Language» il faudra choisir *Java* (Logiquement !)
  • Sur la version de Spring Boot, il faudra choisir une version compatible à votre version de java, moi vu que j’utilise le Java 11, je ne peux pas choisir de version de spring boot supérieur à 7
  • Sur l’onglet « project Metadata» reprenez le même formalisme que moi si vous ne voulez pas, je pense que les options sont assez explicites
  • Sur les « dépendances», comme nous voulons effectuer une API REST, il nous faudra injecter la dépendance « Spring Web ». Vu qu’on réaliser une API REST il nous faudra une base de données mais pour nous faciliter les choses, spring boot nous permet d’utiliser une base de donnée en local qui sera démarrer à chaque lancement de spring Boot qui est « H2 Database ». Et pour finir, la dépendance « Spring Data JPA » nous permettra de gérer la persistance des données avec la base de données.

Ouf !!! Je pense qu’on a fait le tour. Dès que toutes ces configurations sont finies, il faudra cliquer sur « Generate ». Si tout se passe bien, vous devriez avoir un fichier ZIP qui sera téléchargé et il vous faudra juste choisir l’emplacement où vous voulez sauvegarder votre fichier. Une fois terminé, il faudra tout d’abord dézipper le fichier et ouvrir éclipse pour importer le projet.

Pour importer le projet, il vous faudra faire un clic droit et choisir « import » sur l’onglet « project explorer » vous devrez avoir cette fenêtre s’afficher :

Vous devez choisir l’option « Existing Maven Project » et vous aurez cette fenêtre, il vous faudra insérer le chemin d’accès du projet :

Rassurez-vous que le fichier pom.xml est bien cochez et cliquer « finish » et si tout se passe bien, vous devriez voir apparaitre le projet sur votre IDE et la structure de votre projet, ressemblera à ceci :

Pour expliquer vite fais la structure, nous pouvons très vite remarquer le dossier « src » qui contient deux sous-dossiers :

  • Le dossier main qui contiendra les fichiers de configuration et les classes nécessaires.
  • Le dossier test qui concernera les tests unitaires de nos méthodes.
  • Un autre fichier important est le fichier xml qui contiendra toutes nos dépendances :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>

      <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.7.15</version>
            <relativePath/> <!-- lookup parent from repository -->
      </parent>
      <groupId>com.tuto</groupId>
      <artifactId>api</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>api</name>
      <description>api project for Spring Boot</description>
      <properties>
            <java.version>11</java.version>
      </properties>
      <dependencies>
            <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                   <groupId>com.h2database</groupId>
                   <artifactId>h2</artifactId>
                   <scope>runtime</scope>
            </dependency>
            <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-test</artifactId>
                   <scope>test</scope>
            </dependency>
      </dependencies>
      <build>
            <plugins>
                   <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                   </plugin>
            </plugins>
      </build>
</project>

Et comme vous pouvez le constater, nos dépendances sont bien présentes.

En vrai, depuis tu crées ton projet, mais tu ne nous a pas dit sur quoi va-t-on travailler exactement sur notre API

En vrai, je le reconnais… En réalité, sur ce tutoriel, nous travaillerons sur une api de gestion d’article. C’est-à-dire que notre api devra être capable de créer/d’ajouter, supprimer, modifier et d’afficher des articles.

Maintenant que ça, c’est dit, commençons sans plus tarder sur la configuration de la base de donnée.

Configuration de la H2-Database

Voila la configuration de notre fichier « application.properties » :

spring.application.name = api
server.port = 9000
spring.datasource.url = jdbc:h2:mem:articles
spring.h2.console.enabled = true

Tout doucement, je vous vois venir avec vos questions J. Je vais vous expliquer chaque ligne :

  • La ligne 1 permet tout simplement de définir le nom de l’application ;
  • La ligne 2 permet de configurer le port sur lequel va se lancer notre BD. Par défaut il s’agit du port 8080
  • La ligne 3 permet de créer la BD qui s’appelera articles
  • Et enfin la ligne 4 permet d’activer une interface web H2

Ouf, je crois qu’on a fait le tour…

Maintenant vérifions si notre base de données se lance normalement :

  • Allez tout d’abord sur la racine de projet et faite un clic droit, puis allez sur « run as» et choisissez l’option « maven install ». cela nous permettra de lancer maven dans un premier temps.
  • Une fois cette tache terminée, rendez-vous dans le dossier src/main/api et cliquer sur la classe (java) qui se trouve à l’intérieur de votre package :
  • Ensuite faites un clic droit sur le nom de la classe, allez sur « run as» et cliquer sur « java application » vous devrez avoir ceci sur la console :

Une fois l’application démarrée, vous pouvez aller sur l’url : « http://localhost:9000/h2-console et là vous verrez, une fenêtre s’afficher :

Comme vous l’avez vu sur l’avant dernier screen, vous avez l’url JDBC que vous devrez copier sur l’interface ci-dessus. Le nom d’utilisateur est effectivement « sa » donc ne changez rien et le mot de passe est bel et bien vide. Si c’est fait, cliquez sur « connect » et vous serez redirigé vers cette interface :

Et voilà, notre base de données est bel et bien fonctionnelle et nous constatons qu’elle est vide. Maintenant nous pouvons entrer dans le code proprement dit dans la prochaine partie.

Création des packages

Une des forces de spring boot c’est son architecture en couche qui nous permettra de scinder le « model » données, l’interaction entre nos données et le code dans une couche « repository . Vous l’aurez donc compris, il nous faut donc créer 2 packages correspondant à nos différentes couches.

Bien sur il s’agit d’une configuration très basique car le but de ce tutoriel n’est pas de tout vous apprendre sur spring boot en seul jour J.

Pour créer des packages, rendez-vous sur le package « com.tuto.api » et faites un clic droit dessus, ensuite survolez l’option « new » et vous devriez voir apparaitre une option de création de package et là ce sera à vous de jouer. Vous devrez avoir cette arborescence :

Tout d’abord, nous allons créer une classe java qui correspondra à la table que nous avons créée plus haut. Chaque ligne de la table correspondra à une instance de la classe et nous le ferons dans le model (logique J !). Voici la classe en question :

package com.tuto.api.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="articles")
public class Article {

       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;

       @Column(name="name")
       private String articleName;

       @Column(name="quantity")
       private int articleQte;

       @Column(name="price")
       private int articlePrice;

      public Article() {
            super();
       }

      public Article(Long id, String articleName, int articleQte, int articlePrice) {
            super();
            this.id = id;
            this.articleName = articleName;
            this.articleQte = articleQte;
            this.articlePrice = articlePrice;
       }

      public Long getId() {
            return id;
       }

      public void setId(Long id) {
            this.id = id;
       }

      public String getArticleName() {
            return articleName;
       }

      public void setArticleName(String articleName) {
            this.articleName = articleName;
       }

      public int getArticleQte() {
            return articleQte;
       }

      public void setArticleQte(int articleQte) {
            this.articleQte = articleQte;
       }

      public int getArticlePrice() {
            return articlePrice;
       }

      public void setArticlePrice(int articlePrice) {
            this.articlePrice = articlePrice;
      }
}

Je pense qu’on est tous d’accord pour s’accorder à dire qu’à part les « @ machin truc là », le reste n’est rien d’autre qu’une classe java classique.

En fait ces « @ machin truc » s’appellent des « annotations » et elles permettent entre autres d’ajouter certains éléments à des classes, des méthodes et des attributs. Penchons-nous sur celles-ci :

  • @Entity permet d’indiquer que la classe correspond à une table de la BD
  • @Table indique le nom de la table
  • @Id indique que l’attribut spécifié corresponds à la clé primaire de la table et @GeneratedValue(strategy=GenerationType.IDENTIFY) permet l’auto incrémentation.
  • Et enfin @Column permet de faire le lien entre le nom du champ de la table et l’attribut.

Ça s’est dit, il est temps d’implémenter le code qui déclenche les actions pour communiquer avec la base de données : vous l’aurez compris, au tour de la couche « repository »

Le code est le suivant :

package com.tuto.api.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.tuto.api.model.Article;

@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {

}

Quoi c’est tout 😀 ???

Et oui. C’est en ça que réside toute la puissance de spring Boot qui grâce à son composant Spring Data JPA que vous avez injecter au tout début (si si rappelez-vous !!!), il nous permet d’exécuter des requêtes SQL sans avoir besoin de les écrire.

Pourquoi une interface me direz-vous et bien tout simplement parce qu’avec une classe on aurait été obligé d’implémenter les différentes méthodes pour communiquer avec la BD mais là grâce à l’interface, tout ce qu’on a à faire est d’utiliser une interface qui, grâce à la « généricité, nous permet appliquer notre code à n’importe quelle entité d’où la syntaxe <Article, Long>. L’interface JpaRepository possède plusieurs méthodes prédéfinies que l’on va juste implémenter.

Et concernant @Repository, je pense que vous commencez à vous y habituer. Cette annotation permet simplement de déclarer l’interface comme étant un bean et que son rôle est de communiquer avec une source de données (en l’occurrence notre BD).

A ce stade, nous avons déjà fait la moitié du travail, il nous reste juste l’étape d’exécution de notre code. Nous allons ajouter une ligne dans notre base de données pour vous permettre de vous visualiser la chose.

Alors, pour exécuter son code, la méthode la plus facile est implémenter l’interface

CommandLineRunner

Et comme d’habitude lorsqu’on implémente une interface, il faut redéfinir des méthodes. Ici en l’occurrence, il s’agit de méthode run() :

public void run(String... args) throws Exception { }

Pour ajouter donc un article dans la base de données, il vous faut écrire une commande dans la méthode run() et du coup votre fichier ApiApplication devra ressembler à celui-ci :

package com.tuto.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.tuto.api.model.Article;
import com.tuto.api.repository.ArticleRepository;

@SpringBootApplication
public class ApiApplication implements CommandLineRunner {

       @Autowired
       private ArticleRepository articleRepository;

      public static void main(String[] args) {
             SpringApplication.run(ApiApplication.class, args);
      }

       @Override
      public void run(String... args) throws Exception {
            articleRepository.save(new Article(null, "coffee", 4, 2000));
      }
}

Comme vous le voyez, j’ajoute un article dont le nom est « coffee », qui coûte 2000 et j’en ajoute 4.

Maintenant pour le visualiser, vous pouvez aller voir votre interface web de tout à l’heure :

Vous pouvez ainsi ajouter plusieurs lignes en dupliquant la commande et en changeant à chaque fois les valeurs :

package com.tuto.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.tuto.api.model.Article;
import com.tuto.api.repository.ArticleRepository;

@SpringBootApplication
public class ApiApplication implements CommandLineRunner {

       @Autowired
       private ArticleRepository articleRepository;

      public static void main(String[] args) {
             SpringApplication.run(ApiApplication.class, args);
      }

       @Override
      public void run(String... args) throws Exception {
            articleRepository.save(new Article(null, "coffee", 4, 2000));
            articleRepository.save(new Article(null, "milk", 2, 1500));
            articleRepository.save(new Article(null, "tea", 7, 500));
            articleRepository.save(new Article(null, "juice", 5, 1000));
      }
}

Bon à ce stade, il nous reste juste un dernier point à clarifier. Tout au long du tutoriel je vous ai rabachez les oreilles avec le concept d’api sans l’utiliser pour autant. Et oui vous me voyez venir, nous allons inclure une API dans notre projet. Pour cela nous allons utiliser l’api Talend API Tester qui est disponible sur un navigateur internet quelquonque (moi en l’occurrence j’utilise Google Chrome)………………………………….

Pour y accéder, il faut juste vous rendre sur votre navigateur web et saisissez le nom de l’api et vous serez redirigé vers la page ci-dessus.

Comme vous pouvez le voir sur la capture, l’interface est assez logique à appréhender. Mais pour se focaliser sur l’essentiel, nous avons une option qui spécifie la méthode. C’est-à-dire qu’elle est l’action que l’utilisateur souhaite effectuer, un ajout (une requête POST), une suppression (une requête DELETE), etc…

Plus à droite, nous avons une option pour saisir l’url d’accès à notre base de données. Vu que dans notre cas il s’agit d’une méthode POST, on veut donc ajouter un champ dans notre base de donnée comme vous pouvez le voir sur l’option BODY.

Faudrait pas oublier l’interface Repository que l’on devra modifier au niveau de l’annotation comme ceci :

@RepositoryRestResource
public interface ArticleRepository extends JpaRepository<Article, Long> {

}

Et pour l’utiliser, il faudra l’importer dans le « pom.xml » :

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Une fois terminé, vous pouvez cliquer sur le bouton « send » pour valider l’ajout et si vous pouvez vérifier si l’ajout a bien été effectué :

Si tout marche bien, vous aurez cette interface un peu plus bas sur la page.

Vous pouvez aussi allez le vérifier sur l’interface de votre h2-database :