Après avoir développé des tas d’applications web, il y avait une contrainte qui revenait souvent, celle de devoir créer à chaque fois un serveur web avec sa base de données et de réunir le tout via une API REST.
Une perte de temps quand on veut juste se concentrer sur l’application web avec Backbone.js.
Le problème
Ça prend du temps de créer son serveur web avec une API correspondante à son projet. Par exemple avec Express.js et MongoDB, il faut d’abord créer un serveur avec express.js, faire la connexion mongo, puis relier les méthodes MongoDB à votre API, sans compter le système de recherche…
Tout ce que je voulais, c’était avoir un mini projet que je pourrais cloner à chaque fois que je voudrais développer une application web avec comme caractéristiques :
- un dossier public/ où je mettrais tout mon code et qui sera accessible depuis l’adresse du serveur (exemple : un fichier public/test.js pourra être accessible depuis http://localhost:4000/test.js)
- aucunes dépendances de base de données externes
- simple d’utilisation (node app.js pour lancer le serveur, pas plus)
- une API REST complément libre, pour que je puisse appeler n’importe quel type de route tant qu’elle respecte le schéma CRUD et avec n’importe quel type de schéma à l’intérieur.
Exemple : pour créer un nouveau produit, je vais directement appeller la route /produits en POST avec comme body :
{ "name": "iPhone 4" }
View Plain Copy CodeD.r™ Mon serveur va automatiquement créer la collection « produits » si elle n’existait pas déjà et lui ajouter un nouveau produit dont le nom est « iPhone 4″.
La solution : API-as-a-service
Et bien figurez vous que je viens de sortir ce projet, et il se nomme api-as-a-service et il est disponible ici sur GitHub.
Comment ça marche ?
Voici les méthodes de l’API que vous fourni le serveur d’api-as-à-service :
POST – /api/:entity
- Créé un nouveau document pour cette entité, si l’entité (:entity) n’existe pas, alors elle sera créée, le champs id est automatiquement ajouté au document
GET /api/:entity
- Recherche un document pour cette entité
- Quelques paramètres de recherche :
- q pour rechercher dans tous les champs (exemple: /api/products?q=iphone pour chercher dans tous les documents et tous les champs contenant « iphone »)
- {fieldName} pour rechercher avec le nom d’un champs (exemple: /api/products?name=test pour rechercher les produits dont le terme « test » est contenu dans la clé « name »)
- fields pour récupérer seulement certains champs (exemple: /api/products?fields=name,price.retail renverra tous les documents avec seulement la clé « name » et « price » (qui sera contenu dans le hash « price »)), chaque clé imbriqué doit être séparé par un point
- limit pour limiter le nombre de résultats (exemple: /api/products?limit=20)
- offset pour spécifié à partir de quelle occurrence on commence à renvoyer les résultats (example: /api/products?offset=5 nous renverra les produits à partir du 5 ème)
PUT /api/:entity/:id
- Met à jour le document possédant l’id :id pour l’entité :entity
DELETE /api/:entity/:id
- Supprime le document avec l’id :id pour l’entité :entity
DELETE /api/:entity
- Demande un « token » pour supprimer l’entité :entity ainsi que tous ses documents.
- Renvoie l’url pour confirmer la suppression de l’entité
DELETE /api/:entity/:token
- Supprime définitivement l’entité :entity
Installation
On va donc commencer par cloner le repository api-as-a-service, placez vous où vous voulez et faites :
git clone git://github.com/Atinux/api-as-a-service.git
On va installer maintenant les dépendances du projet, ça va aller vite, il n’y a qu’expressJS, rendez vous dans le dossier api-as-a-service/ avec la console et faites :
npm install -d
C’est bon on a fini, notre serveur est prêt à être lancé, il nous reste juste à faire :
node app.js
Vous pouvez maintenant vous rendre sur http://localhost:4000/ et vous allez voir quelque chose comme : 
C’est bon, votre API est prête, il vous reste maintenant qu’à coder votre application web dans le dossier public/ !
La démo ! La démo ! La démo !
Comme vous pouvez le voir, on peut ajouter, éditer, supprimer et rechercher des librairies.
À chaque fois on va contacter l’api distante http://api-as-a-service.jit.su qui est tout simplement le projet api-as-a-service que je vous ai présenté qui tourne sur les serveur de Nodejitsu.
Amusez-vous bien
Merci à Alexandre Fournel pour m’avoir inspiré à développer ce projet.


Merci, excellente idée, mettre en place un backend c’est toujours le truc qui me décourage le plus avant de me lancer dans un nouveau projet. Surtout quand il y a beaucoup de front et qu’on aime ça …la back c’est relou.
Hello Seb,
Très sympa comme initiative !
Tu connaissais déjà le module de Mark Cavage http://mcavage.github.com/node-restify ?
Keep up the good work!
Pierre
Merci
Non je ne connaissais pas le module de Mark Cavage, mais d’après ce que je vois, c’est pour construire une API Rest de la bonne façon.
Mon projet est plus d’avoir déjà une API de prête et de ne pas s’embêter à la developper.
Par contre utiliser node-restify pour mon projet api-as-a-service peut être pratique, merci pour l’info
Sébastien
Dans la documentation de GET /api/:entity, pour le paramètre {fieldname}
Ce n’est pas la clé « name » et « retail » qui seront récupéré au lieu de « name » et « price» ?
En fait on va récupérer un hash de ce style:
{ name: 'XXX', price: { retail: 'XXX' } }Je voulais dire pour le paramètre fields pardon.
L’idée est très intéressante. Pouvons nous gérer avec cette solution une api un peu plus complexe ? Par exemple retrouver le dossier n°2 du carton n°12 de la boite n°1
URI: /boites/1/cartons/12/dossiers/2
Pouvons nous aussi cumuler la recherche ?
exemple: /api/products?name=test&category=mini|category=little
Pour le moment non, mais c’est une très bonne idée et je peux vous conseiller de poster une Issue sur le projet GitHub
Merci pour votre intérêt !