5. NodeJS est ...
1. Projet open source
2. Créé le 19 février 2009 par
Ryan Dahl
3. Ecrit en C/C++
4. Basé sur le Moteur Javascript
V8
Github: https://github.
com/joyent/node
6. Que fait NodeJS ?
1. NodeJS est un serveur
2. Programmation non bloquante
(Callbacks)
3. Programmation Événementiel
7. Un serveur
var https = require('https');
https.createServer(function (req, res) {
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('Hello Worldn');
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
8. 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
10. “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
22. 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...');
23. 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
24. 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).
25. 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
26. 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 »
27. Bonnes pratiques
1. Fournir un SDK
2. Fouir l’optionnel et le paramétrable, rendre obligatoire est
explicite
3. Aucune informations essentiels dans les entêtes
4. Paramètres génériques, valable sur toute l’API
5. Numéroter les erreurs avec un identifiant unique à tous vos
projets
6. Penser au cache
7. Utiliser un sous domaine distinct pour l’API
29. 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) {...}
}
30. 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.
31.
32. Le protocole OAuth
OAuth 2 fournit plusieurs type d’accès
1. Authorization Code pour les application web
2. Password pour un accès avec
Username/Password
3. Client credentials pour application
4. Implicit pour les application mobile et les
application basé navigateur
33.
34. Le protocole OAuth
npm install oauth2orize
npm install passport
// create OAuth 2.0 server
var https = require('https');
var server = oauth2orize.createServer();
Implémenter les étape du protocole OAuth
server.serializeClient(...);
server.deserializeClient(...);
server.grant(...);
server.exchange(...);
35. 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);
});
}
));