26 July 2018
Dans la derniere vesion de Spring, est apparu un framework de développement rapide nommé Spring Boot.
Ce framework, rend facile l'élaboration d'applications en permettant d'instrumenter du code avec des annotations. Les applications sont complètement configurés avec des adaptateurs par défaut, ce qui permet d'une par un résultat rapide, et d'autre part une customisation progressive possible en remplaçant au fur et à mesure des besoins les adapteurs par défaut.
L'exemple suivant :
Montre comment rendre accessible par API restful des données en base de données mysql.
Très facile à mettre en oeuvre.
L'exemple permet de lister des utilisateurs en base de donnée et d'en ajouter un.
L'exemple est très simple, il ne met pas en oeuvre de sécurité. Il utilise JPA pour accéder à la couche de données.
Dans les critiques que l'on peut formuler, celui d'utiliser une méthode GET pour ajouter des données, ce qui n'est pas très restful.
Je l'adapte au données de canhelp, ce qui demande quelques adaptations pour gérer le champ profil comme une énumération.
Parmis les modifications effectués, je change le comportement de la classe User, qui sert de bean pour l'entity.
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer iduser;
par
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer iduser;
En effet, dans le cas particulier de MySQL, si on utilise AUTO, la couche d'accès aux données créé une table hibernate_sequence.
La table comprend simplement une valeur, incrémentée à chaque creation de ligne :
SELECT * FROM `hibernate_sequence`
2
Les appels HTTP pour lister les user fonctionne :
curl 'localhost:8080/demo/all'
L'appel, modifié pour créer une nouvel user aussi :
curl 'localhost:8080/demo/add?login=hnlocher&role=monteur&profil=FIF_MIF&firstName=Hans-Nikolas&lastName=Locher&email=hnlocher@cst.fr&password=password&barcode=CST1800124&ip=192.168.24.80'
Je peux ajouter sans heurt, des pages statiques (index.html) et dynamique, hello.ftl, utilisant le moteur de template freemarker.
Le controleur pour accéder a la page est dans la même classe que pour l'accès à un contenu JSON. Comment se fait la discrimation ?
@GetMapping(path="/all")
public @ResponseBody Iterable<User> getAllUsers() {
// This returns a JSON or XML with the users
return userRepository.findAll();
}
@GetMapping("/hello")
public String hello(Model model, @RequestParam(value="name", required=false, defaultValue="World") String name) {
model.addAttribute("name", name);
return "hello";
}
Dans un cas, on précise que c'est le contenu du retour qu'il faut envoyer, et le framework fait le reste.
Dans le second cas, un modèle est passé en paramètre pour être configuré et le nom de la vue est renvoyé. Par défaut, le framework cherche un template correspondant à la vue.
Je superpose à l'exemple précédent une partie de la recette présentée ici :
En particulier, il faut ajouter la section suivante dans le fichier pom.xml :
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
Pour gérer un formulaire de saisie de login mdp, il faut faire les modifications suivantes :
Cela fonctionne, on peut se connecter dans un navigateur sur la page "home", puis en cliquant, aller sur "hello", qui est intercepté par un passage au formulaire de la page "login". Ensuite, on reçois un hello customizé avec le nom du user.
Ce qui ne marche pas :
La securité semble gérer par des cookies de session, ce qui explique sans doute qu'en l'absence d'un token, ce ne puisse pas fonctionner avec curl.
Un autre exemple bien documenté :
Sinon, un peu de littérature :
Exemple d'API