Publié le 06/20/2017, rédigé par Davy CLAISSE

Sparkjava

Comment récupérer les paramètres d'une requête HTTP avec Sparkjava ?

Prérequis, savoir créer un micro-service avec Sparkjava.

Éléments du problème

Lorsque l'on construit un service RESTful, une partie des paramètres sont passés directement dans l'URL de la requête. Par exemple pour récupérer une Personne dont l'identifiant est 123456 je me connecterai à l'URL :

GET "/person/123456"

Nous voyons ici que le paramètre de la requête se situe en fin d'URL. For heureusement, Sparkjava fournit une API permettant de déclarer ses URL via des regexp et d'y définir des paramètres en les nommant.

Comment récupérer un paramètre passé dans l'URL ?

En reprenant le cas précédent, je souhaite que Sparkjava affecte automatiquent la valeur spécifiée dans l'URL au paramètre personId. Pour cela je déclarerai cette route :

import spark.Spark;

public class Main {
    public static void main(String[] args) {
        Spark.get("/person/:personId", new GetPerson());
    }
}

Et j'implémenterai ma route comme suit :

import spark.Route;

class GetPerson implements Route {
    @Override
    public Object handle(Request request, Response response) throws Exception {
        // Ici ':personId' correspond à ce qui est écrit dans la route ci-dessus :
        String personId = request.params(":personId");

        return "ID = " + personId;
    }
}

À titre d'exemples, voici les valeurs que prendra la variable personId pour les URL suivantes :

GET "/person/123456"    # personId = 123456
GET "/person/555555"    # personId = 555555
GET "/person/024680"    # personId = 024680

Comment récupérer la valeur d'un paramètre passé dans le corps d'une requête HTTP ?

Reprenons l'exemple précédent mais avec le cas d'un PUT cette fois-ci. Rappel, un PUT correspond à l'action UPDATE en REST. Je déclare donc une action de type PUT sur l'URL /person/ pour laquelle je m'attends à recevoir deux paramètres : name et personId.

import spark.Spark;

public class Main {
    public static void main(String[] args) {
        Spark.put("/person/", new UpdatePerson());
    }
}

Et j'implémenterai ma route comme suit :

import spark.Route;

class UpdatePerson implements Route {
    @Override
    public Object handle(Request request, Response response) throws Exception {
        String personId = request.queryParams("personId");
        String personName = request.queryParams("personName");

        return "ID = " + personId + " / NAME = " + personName;
    }
}

Et si mon paramètre est une liste ?

La déclaration de la route ne change pas mais son implémentation oui :

import spark.Route;

class UpdatePerson implements Route {
    @Override
    public Object handle(Request request, Response response) throws Exception {
        // Récupération du tableau des noms :
        String[] names = request.queryParamsValues("names");

        return "NAME LIST : " + String.join(", ", names);
    }
}