|
Publié le par Davy CLAISSE

Sparkjava

Créer un micro-service en deux minutes avec Sparkjava

Sparkjava késako ?

Sparkjava est un framework web utilisable en Java 8 et Kotlin, inspiré de Sinatra (un framework web Ruby) et qui permet de fabriquer des micro-services en quelques minutes. Nous allons présenter ici la version Java.

Comment ajouter Sparkjava à mon projet ?

Avec Maven : En ajoutant la dépendance spark-core au fichier pom.xml de votre projet.

<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.6.0</version>
</dependency>

Avec Gradle : En ajoutant la dépendance spark-core au fichier build.gradle de votre projet.

compile "com.sparkjava:spark-core:2.6.0"

Principe de base

Sparkjava est taillé pour l'écriture d'API REST. En conséquence, il vous propose d'associer de manière déclarative un verbe REST à une URL pour y déclencher une action.

Le principe est simplissime, tout passe par la classe spark.Spark (cf. design pattern facade):

// Retourne la String **"MON ACTION"** à l'URL **'/mon_url'**
// en fonction du verbe REST spécifié :
Spark.get("/mon_url", (request, response) -> "MON ACTION");        // GET
Spark.post("/mon_url", (request, response) -> "MON ACTION");       // POST
Spark.put("/mon_url", (request, response) -> "MON ACTION");        // PUT
Spark.delete("/mon_url", (request, response) -> "MON ACTION");     // DELETE
Spark.options("/mon_url", (request, response) -> "MON ACTION");    // OPTIONS

Comment associer une action à une URL ?

Il y a trois syntaxes possibles :

  • Celle dite "classique".
  • Celle utilisant les classes anonymes.
  • Celle de Java 8 utilisant les lambdas.
Exemple avec la syntaxe classique

Ce code est le plus volumineux mais il a l'avantage de rendre les contrôleurs réutilisables (cas du même contrôleur pour du GET et du POST) ou encore de définir une hiérarchie d'héritage entre-eux :

import spark.Spark;
import spark.Route;

public class Main {
    public static void main(String... args) {
        Spark.get("/mon_url", new MyController());
    }
}

class MyController implements Route {
    @Override
    public Object handle(Request request, Response response) throws Exception {
        // Le code à exécuter est ici. Vous pouvez retourner une String
        // contenant au choix du HTML, du JSON ou tout autre chose.
        return "MON ACTION";
    }
}
Exemple avec la syntaxe Java 8

Ce code est très compact et très pratique pour effectuer de petits tests, cependant les lambdas ainsi définies ne sont pas réutilisables à travers plusieurs URL ou plusieurs verbes REST.

import spark.Spark;

public class Main {
    public static void main(String... args) {
        Spark.get("/mon_url", (request, response) -> {
            // Le code à exécuter est ici. Vous pouvez retourner une String
            // contenant au choix du HTML, du JSON ou tout autre chose.
            return "MON ACTION";
        });
    }
}
Exemple avec les classes anonymes

C'est à mon sens le code le moins pratique des trois car il allie la lourdeur de l'écriture classique avec la non réutilisabilité des lamdbas de Java 8.

import spark.Spark;
import spark.Route;

public class Main {
    public static void main(String... args) {
        Spark.get("/mon_url", new Route() {
            @Override
            public Object handle(Request request, Response response) throws Exception {
                // Le code à exécuter est ici. Vous pouvez retourner une String
                // contenant au choix du HTML, du JSON ou tout autre chose.
                return "MON ACTION";
            }
        });
    }
}

Voilà, comment promis vous en savez assez pour démarrer un micro-service très simple web avec Sparkjava.