Ca faisait longtemps que je me demandais ce qu’est une API RESTful... J’ai fait quelques recherches sur le net pour en svoir plus... Et comme d’habitude, chacun a un peu sa propre définition... J’avais trouvé une, ou plutôt des définition sur, mais la discussion a été supprimée. C’est que tout le monde n’était pas d’accord... Je pense que c’est pour cela qu’elle a été supprimée... Je me rabat donc sur la définition de wikipedia que vous trouverez ici !
Build a RESTful API Using Node and Express 4
Build a RESTful API Using Node and Express 4, c’est le titre du tutoriel que j’ai suivi. Il se trouve sur cette page.
En gros on utilise le router d’Express 4, Mongoose pour interagir avec la base MongoDB. Et on utilise Postman sur Chrome ( Chromium dans mon cas... ) pour tester...
L’application
Ce que l’API fait :
- CRUD
- URL standard comme
http://example.com/api/bears
ouhttp://example.com/api/bears/:bear_id
- Utiliser les verbes HTPP propres à RESTful :
GET
,POST
,PUT
,DELETE
- Retourner jes données JSON
- Loggé toutes les requêtes sur la console
Pré-requis : avoir Node installé sur son ordi ! Et npm...
Pour démarrer
En fait, j’ai suivi une première fois ce tutoriel pas à pas.
Du coup, là, j’ai cloné le projet depuis git avec netbeans.
Voici la structutre du projet :
- - app/
- ----- models/
- ---------- bear.js // our bear model
- - node_modules/ // created by npm. holds our dependencies/packages
- - package.json // define all our node app and dependencies
- - server.js // configure our application and create routes
Les paquets Node
Les paquets node sont définis dans package.json :
Express est le framework node. Mongoose est l’ORM qui permet de communiquer avec la base de données MongoDB. Body-parser va permettre de traiter le contenu POST des requêtes HTTP pour pouvoir l’utiliser.
Installation des paquets
Ce rendre depuis un terminal dans le dossier du projet puis faire un $ npm install
.Un dossier node_modules
est créé avec à l’intérieur les modules demandé dans le fichier package.json
.
Mise en place du serveur
Tout ce passe dans server.js
. Nous l’avons défini dans package.json
par l’intermédiaire de l’attribut main
.
Voici le code de server.js
:
- // BASE SETUP
- // =============================================================================
- // call the packages we need
- var express = require('express');
- var bodyParser = require('body-parser');
- var app = express();
- // configure app
- app.use(bodyParser());
- var port = process.env.PORT || 8080; // set our port
- var mongoose = require('mongoose');
- mongoose.connect('mongodb://node:node@novus.modulusmongo.net:27017/Iganiq8o'); // connect to our database
- var Bear = require('./app/models/bear');
- // ROUTES FOR OUR API
- // =============================================================================
- // create our router
- var router = express.Router();
- // middleware to use for all requests
- router.use(function(req, res, next) {
- // do logging
- console.log('Something is happening.');
- next();
- });
- // test route to make sure everything is working (accessed at GET http://localhost:8080/api)
- router.get('/', function(req, res) {
- res.json({ message: 'hooray! welcome to our api!' });
- });
- // on routes that end in /bears
- // ----------------------------------------------------
- router.route('/bears')
- // create a bear (accessed at POST http://localhost:8080/bears)
- .post(function(req, res) {
- var bear = new Bear(); // create a new instance of the Bear model
- bear.name = req.body.name; // set the bears name (comes from the request)
- bear.save(function(err) {
- if (err)
- res.send(err);
- res.json({ message: 'Bear created!' });
- });
- })
- // get all the bears (accessed at GET http://localhost:8080/api/bears)
- .get(function(req, res) {
- Bear.find(function(err, bears) {
- if (err)
- res.send(err);
- res.json(bears);
- });
- });
- // on routes that end in /bears/:bear_id
- // ----------------------------------------------------
- router.route('/bears/:bear_id')
- // get the bear with that id
- .get(function(req, res) {
- Bear.findById(req.params.bear_id, function(err, bear) {
- if (err)
- res.send(err);
- res.json(bear);
- });
- })
- // update the bear with this id
- .put(function(req, res) {
- Bear.findById(req.params.bear_id, function(err, bear) {
- if (err)
- res.send(err);
- bear.name = req.body.name;
- bear.save(function(err) {
- if (err)
- res.send(err);
- res.json({ message: 'Bear updated!' });
- });
- });
- })
- // delete the bear with this id
- .delete(function(req, res) {
- Bear.remove({
- _id: req.params.bear_id
- }, function(err, bear) {
- if (err)
- res.send(err);
- res.json({ message: 'Successfully deleted' });
- });
- });
- // REGISTER OUR ROUTES -------------------------------
- app.use('/api', router);
- // START THE SERVER
- // =============================================================================
- app.listen(port);
- console.log('Magic happens on port ' + port);
Je pense que les commentaires sont suffisant pour comprendre en gros ce que ce passe par l’intermédiaire de ce fichier.
Démarrer le serveur et tester
Pour lancer le serveur, un simple : $ node server.js
en ligne de commande.
Tester l’API avec Postman
On trouve Postman dans le store de Chrome en suivant ce lien.
En gros, on s’en sert pour envoyer des requêtes HTTP à l’URL choisie. On peut même passer des paramètres. Pour ce faire :
- Saisir une URL ou adresse
- Choisir un verbe
- Eventuellement remplir des champs pour passer des paramètres ( utiliser le formulaire de type
x-www-form-urlencoded
) - Cliquer sur le bouton : Send
Pour voir si notre API marche, saisir l’url : http://localhost:8080/api
et choisir le verbe POST
et cliquer sur le bouton send. Normalement, le message "hooray ! welcome to our api !" apparait !
Base de données
Il faut une base de données pour stocker... Heu, les données !
Je ne me suis pas servi de service externe pour ce faire, mais j’ai utilise MongoDB qui est déjà installé dans sur mon ordi.
Pour créer la base, il faut créer le dossier data
à la racine du projet. Puis, dans un nouveau terminal, lancer quelque chose comme $ mongod --dbpath /home/robomatix/nodejs/testapp/node-api/data
sans entrer dans un dossier, puis faire un $ mongo
. Un message informe que l’on est connecté à test. En faite, cette base n’existe pas. Pour qu’une base existe, il commencer à la remplir... Pour utiliser une base avec un nom plus parlant, il faut saisir use nodeapi
. Maintenant, le message "switched to db nodeapi" s’affiche. La base nodeapi
n’existe toujours pas. Il faut toujours commencer à la remplir. Ce qui sera bientôt fait...
Il faut modofoer notre fichier principal pour qu’il se connecte à la bonne base.
Donc, dans le fichier server.js
, remplacer la ligne ( 15 normalement ) :
- mongoose.connect('mongodb://node:node@novus.modulusmongo.net:27017/Iganiq8o');
Par
- mongoose.connect('localhost:27017/nodeapi');
Le modèle Bear
Avant de pouvoir enregistrer dans la base pour qu’elle existe réellement, il faut créer un modèle de données. Dans le tutotriel, il s’agit de Bear dont nout nous trouvons le modèle dans app/models/bear.js
.
- var mongoose = require('mongoose');
- var Schema = mongoose.Schema;
- var BearSchema = new Schema({
- name: String
- });
- module.exports = mongoose.model('Bear', BearSchema);
Note : on appelle ce fichier dans la partie de configuration du serveur dans le fichier server.js
vers la ligne 16 :
- var Bear = require('./app/models/bear');
Router et Routes dans Express
Une instance d’Express Router est utilisée pour gérer les routes. Voici un tableau récapitulatif des routes utilisées et de leurs verbes et de leur description.
Route | HTTP Verb | Description |
/api/bears | GET |
Get all the bears. |
/api/bears | POST |
Create a bear. |
/api/bears/:bear_id | GET |
Get a single bear. |
/api/bears/:bear_id | PUT |
Update a bear with new info. |
/api/bears/:bear_id | DELETE |
Delete a bear. |
Route Middleware
La définition d’un middleware se trouve ici.
Un exemple pour que quelque chose ce passe à chaque fois qu’une requête est envoyé à notre API.
- // middleware to use for all requests
- router.use(function(req, res, next) {
- // do logging
- console.log('Something is happening.');
- next(); // make sure we go to the next routes and don't stop here
- });
router.use(function())
est donc ce dont nous avons besoin pour déclarer un middleware. L’ordre de déclaration est important. Ce la déterrmine l’ordre d’exécution.
Les middleware sont puissants. Il permettent, entre autres de tester la validiter des informations reçues. On peut aussi s’en servir pour des générer des logs et des stats.
Il est renvoyé des information au format JSON data. C’est un standard pour une API et cela facilitera les choses pour ceux qui utiliseront votre API.
Pensez à mettre next()
pour indiquer que l’on continue sur les routes suivantes. Sans cela, l’application s’arrêterais...
Conclusions
Dans ce tutoriel, on apprend les bases pour faire du CRUD sur une ressource spécifique. Ce sont de bonnes fondations pour ensuite créer des APIs plus grosses et plus robustes.
Répondre à cet article
Tous les champs sont obligatoires
Suivre les commentaires :
|
