NodeJS for Mobile Apps
Habib MAALEM
Sommaire
1. C’est quoi NodeJS ?
2. Que fait NodeJS ?
3. Pourquoi NodeJS ?
4. Modules
5. Cas d’utilisation
6. Restful API
7. CRUD
8. SDK
9. Le protocole OAuth
Habib MAALEMDéveloppeur Front End @AllégorieTV
LinkedIndz.linkedin.com/in/habibmaalemTwittertwitter.com/HabibMAALEM
NodeJS ??
C’est quoi NodeJS
Que fait NodeJS
Pourquoi NodeJS
Cas d’utilisation
NodeJS est ...1. Projet open source2. Créé le 19 février 2009 par
Ryan Dahl3. Ecrit en C/C++4. Basé sur le Moteur Javascript
V8
Github: https://github.com/joyent/node
Que fait NodeJS ?
1. NodeJS est un serveur2. Programmation non bloquante
(Callbacks)3. Programmation Événementiel
Un serveur
var https = require('https');
https.createServer(function (req, res) {
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('Hello World\n');
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
Programmation non bloquante// Bloquant
var fichierA = lireFichier(’FichierA.txt’);
console.log(’Fichier A’);
var fichierB = lireFichier(’FichierB.txt’);
console.log(’Fichier B’);
----------------------------------------------------------------------------------
// Non Bloquant
var fichierA = lireFichier(’FichierA.txt’);
console.log(’Fichier A’);
var fichierB = lireFichier(’FichierB.txt’);
console.log(’Fichier B’);
Fichier A, Fichier B
Fichier B, Fichier A
Programmation Événementiel *
Node est basé sur un modèle d’événement.
Tout est basé sur des messages
“single-thread event loop”
Analogie du roi
Le roi ordonne à ses messagers, qui reviennent dès qu'ils le peuvent, et le roi traite les réponses au fur et à mesure, une à la fois.
Pas pratiques pour les tâches lourdes
“single-thread event loop”
“single-thread event loop”
“single-thread event loop”
Les Modules
1. NPM: Node Packaged Module2. Plus de 62 000 modules3. Une installation simple et facile
Les Modules
1. Don't Repeat Yourself2. Don't Reinvent the Wheel3. Learn 2 Search
‘npm install -g grunt’
Node Packaged Modules
Cas d’utilisation NodeJS
1. Applications Web.2. Applications CLI.3. Applications Réseaux.4. Jeux en ligne.5. Outils de collaboration.6. Messagerie instantanée7. Réseaux sociaux8. Outils de traduction en temps réel9. API
Qui utilisent NodeJS
eBay
Walmart
RESTful API ?
REST: Representational State TransferAPI: Application Programming Interface
‘GET’ ‘PUT’ ‘POST’ ‘DELETE’
RESTful API ?
Méthode HTTP Étape CRUD
POST Create
GET Read
PUT Update
DELETE Delete
RESTful API ?
var express = require('express');
var app = express();
app.get('/annonces', function(req, res) {
res.send([{name: 'annonce1'}, {name: ’annonce2’}]);
});
app.get('/annonces/:id', function(req, res) {
res.send({
id:req.params.id, name: ‘Titre’,
description: ‘Description’});
});
app.listen(3000);
console.log('Listening on port 3000...');
RESTful API ?
Méthode HTTP /annonces/ /annonces/:id
POST Ajout d’une annonce -----
GET Liste des annonces Détail d’une annonce
PUT ----- Modification d’une annonce
DELETE ----- Suppression d’une annonce
RESTful API ?
La notion de service RESTful est très normée, et quelques règles doivent être respectées pour se réclamer RESTful:
1. Le service permet de manipuler une collection d’entités.2. Les méthodes POST/GET/PUT/DELETE sont implémentées pour
manipuler la collection et/ou les entités, sur le modèle du CRUD.3. Les méthodes PUT et DELETE sont « idempotentes », ce qui
signifie qu’effectuer plusieurs fois la même requête aura le même effet que de l’exécuter une seule fois.
4. La méthode GET est « sûre », ce qui signifie qu’elle ne modifie pas l’état du serveur ni les données (à l’inverse de POST/PUT/DELETE).
Utiliser les bons codes de statut HTTP
Code Message Description
200 OK Le code de statut par défaut en cas de succès. Il sera en général accompagné d’un corps de réponse en JSON
400 Bad request Le code d’erreur générique dans le cas d’informations invalides fournis au service dans la requête (format de données invalide par exemple
404 Not Found Code d’erreur typiquement retourné dans le cas d’une URI d’entité (en PUT ou GET) qui n’existe pas
405 Method Not Allowed
Retourné lorsque l’utilisateur effectue un appel à une URL ne supportant pas la méthode demandée
Utiliser les bons codes de statut HTTP
Code Message Description
406 Not Acceptable
Ce code sera retourné lorsque la requête contient des entêtes qui nous semblent incompatibles avec le fonctionnement du service, par exemple si dans l’entête « Accept » on ne trouve pas « application/json », ça signifie que la requête déclare explicitement ne pas accepter ce format, et on n’est donc pas en mesure de communiquer avec ce client
500 Server Error Ce sera le code d’erreur par défaut, celui qu’on ne souhaite jamais retourner car il s’agit d’une erreur « non traitée »
Bonnes pratiques
1. Fournir un SDK2. Fouir l’optionnel et le paramétrable, rendre obligatoire est
explicite3. Aucune informations essentiels dans les entêtes4. Paramètres génériques, valable sur toute l’API5. Numéroter les erreurs avec un identifiant unique à tous vos
projets6. Penser au cache7. Utiliser un sous domaine distinct pour l’API
SDK : Kit de développement
Software Development Kit// Une simple interface de consommation en JAVA
public class SehhaAPI {
public String getAuthorizationUrl() {...}
public boolean authorizeAndAcquireTokens(String code) {...}
private void refreshToken() throws Exception {...}
private boolean getNewAccessToken(boolean refreshing) {...}
private String sehhaRequest(String requestURL) {...}
}
Le protocole OAuth
OAuth permet aux utilisateurs de donner, à un site/application « consommateur », l'accès à des informations personnelles provenant d'un site/application « fournisseur » de service ou de données. ceci tout en protégeant le pseudonyme et le mot de passe des utilisateurs.
Le protocole OAuth
OAuth 2 fournit plusieurs type d’accès
1. Authorization Code pour les application web2. Password pour un accès avec
Username/Password3. Client credentials pour application4. Implicit pour les application mobile et les
application basé navigateur
Le protocole OAuth
npm install oauth2orizenpm install passport
// create OAuth 2.0 servervar https = require('https');var server = oauth2orize.createServer();
Implémenter les étape du protocole OAuthserver.serializeClient(...);server.deserializeClient(...);server.grant(...);server.exchange(...);
Le protocole OAuth
var BasicStrategy = require('passport-http').BasicStrategy;var ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy;passport.use(new ClientPasswordStrategy(
function(clientId, clientSecret, done) {clients.findByClientId(clientId, function(err, client) {
if (err) { return done(err); }if (!client) { return done(null, false); }if (client.clientSecret != clientSecret) { return done(null, false); }return done(null, client);
});}
));
Merci
Questions