serveur http

20
Par Jame Gaglo

Upload: james-gaglo

Post on 16-Jul-2015

252 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Serveur http

Par Jame Gaglo

Page 2: Serveur http

1. var http = require('http');

2. var server = http.createServer();

3. server.on('request', function(req, res) {

4. res.writeHead(200, {'Content-Type': 'text/plain'});

5. res.write('Hello World!');

6. res.end();

7. });

8. server.listen(4000);

2 par James Gaglo

Page 3: Serveur http

Sur la ligne 1 vous obtenez le module http, à partir duquel vous pouvez créer un objet serveur en appelant http.createServer () (ligne 2).

Vous pouvez alors écouter les événements request, qui se produisent quand un nouveau client se connecte. La fonction de rappel de l'événement fourni a deux arguments: les objets request et response. Vous pouvez alors utiliser l'objet request pour connaître les détails au sujet de cette requête et utiliser l'objet response pour répondre au client pour le client.

3 par James Gaglo

Page 4: Serveur http

Lors de l'écoute d'événements request, la fonction de callback obtient un objet http.ServerRequest comme premier

argument. Cet objet contient les attributs url ,method et headers que nous pouvons inspecter.

req.url: Cet attribut contient l'URL de la requête en tant que chaine de caractère.

Exemple pour l'analyser:

require('http').createServer(function(req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end(req.url);

}).listen(4000);

req.method: Il contient la méthode HTTP utilisée par la requête :GET, POST, DELETE, ou HEAD.

4 par James Gaglo

Page 5: Serveur http

req.headers: Celui-ci contient un objet avec une propriété pour chaque en-tête HTTP sur le

demande. Pour l'analyser, vous pouvez exécuter le serveur:

var util = require('util');

require('http').createServer(function(req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end(util.inspect(req.headers));

}).listen(4000);

util.inspect () est une fonction utilitaire qui analyse les propriétés de n'importe quel objet.

5 par James Gaglo

Page 6: Serveur http

Quand vous obtenez l'événement request sur un serveur, vous n'obtenez pas immédiatement le corps de cette requette, tout simplement parce qu'il n'est pas encore arrivé. Mais si vous voulez, vous pouvez écouter

les événements de donnéescar l'objet request est un ReadStream:

1. var writeStream = ...

2. require('http').createServer(function(req, res) {

3. req.on('data', function(data) {

4. writeStream.write(data);

5. });

6. }).listen(4001);

6 par James Gaglo

Page 7: Serveur http

L'objet response (le second argument de la fonction de rappel) est utilisée pour répondre

au client. Avec elle, vous pouvez écrire les en-têtes et écrire le corps.

Ecrire le Header

Pour écrire une en-tête, utilisez res.writeHead (statut,headers), où headers est un argument optionnel

avec un objet contenant une propriété pour chaque en-tête que vous voulez envoyer. Prenons l'exemple suivant:

7 par James Gaglo

Page 8: Serveur http

1. require('http').createServer(function(req, res) {

2. res.writeHead(200, {

3. 'Content-Type': 'text/plain',

4. 'Cache-Control': 'max-age=3600' });

5. res.end('Hello World!');

6. }).listen(4000);

$ curl -i http://localhost:4000 pour voir le résultat

8 par James Gaglo

Page 9: Serveur http

Modification ou Définition d'un Header

1. res.setHeader(name, value);

Cela ne fonctionne que si vous n'avez pas déjà envoyé un morceau du corps en utilisant res.write () ou

res.end (). Cela échoue également si vous avez déjà utilisé res.writeHead () sur cette l’objet response , parce que les en-têtes serait déjà été envoyé.

9 par James Gaglo

Page 10: Serveur http

Suppression d’un Header

Vous pouvez supprimer un en-tête que vous avez déjà mis en appelant res.removeHeader et en fournissant le

nom de l'en-tête:

1. res.removeHeader ('Cache-Control');

Encore une fois, cela ne fonctionne que si les en-têtes de la réponse n'ont pas déjà été envoyées.

10 par James Gaglo

Page 11: Serveur http

Rédaction du corps de la réponse

Un serveur HTTP envoie le corps de réponse après l'envoi de l'en-tête de réponse. Deux façons de le faire :

écrire une chaîne:

1. res.write ('Bonjour');

ou utiliser un tampon existant:

1. var tampon Buffer = new ('Bonjour le monde');

2. res.write (buffer);

11 par James Gaglo

Page 12: Serveur http

Corps de réponse STREAMING HTTP

Une des grandes caractéristiques de Node est la capacité de consommer et de produire des flux facilement à partir de différents

sources. Parce que HTTP est un protocole principal dans Node, les réponses HTTP ne sont pas différentes.

L'encodage chunked de HTTP permet à un serveur de continuer d'envoyer des données au client même si la taille du corps de réponse n'a pas été envoyé. A mons que vous ne spécifiez un en-tête Content-Length, le serveur Node HTTP envoie l'en-tête qui suit au client:

Transfer-Encoding: chunked

12 par James Gaglo

Page 13: Serveur http

Quelques exemples de streaming en utilisant cette fonction du serveur HTTP sont le piping de la sortie d'un fichier ou d'un autre processus

13 par James Gaglo

Page 14: Serveur http

Piping d’un fichier

Vous pouvez diriger n'importe quel ReadStream dans la réponse. Voici un exemple qui redirige un fichier dans la réponse :

1. var fs = require('fs');

2. require('http').createServer(function(req, res) {

3. res.writeHead(200, {'Content-Type': 'video/mp4'});

4. var rs = fs.createReadStream('test.mp4');

5. rs.pipe(res);

6. }).listen(4000);

Si vous ouvrez http://127.0.0.1:4000 sur n'importe quel navigateur moderne, le film devrait

commencer à jouer immédiatement, même si elle n'est pas complètement chargé.

14 par James Gaglo

Page 15: Serveur http

Piping de la sortie d’un autre processus 1. var spawn = require('child_process').spawn;

2. require('http').createServer(function(req, res) {

3. var child = spawn('tail', ['-f', '/var/log/system.log']);

4. child.stdout.pipe(res);

5. res.on('end', function() {

6. child.kill();

7. });

8. }).listen(4000);

15 par James Gaglo

Page 16: Serveur http

Le chemin du fichier est fourni dans l’url comme ceci : http://localhost:4000/path/to/my/file.txt

1. var path = require('path'), 2. fs = require('fs'); 3. 4. require('http').createServer(function(req, res) { 5. var file = path.normalize('.' + req.url); 6. console.log('Trying to serve', file); 7. function reportError(err) { 8. console.log(err); 9. res.writeHead(500); 10. res.end('Internal Server Error'); 11. }

16 par James Gaglo

Page 17: Serveur http

12. path.exists(file, function(exists) { 13. if (exists) { 14. fs.stat(file, function(err, stat) { 15. var rs; 16. if (err) { 17. return reportError(err); 18. } 19. if (stat.isDirectory()) { 20. res.writeHead(403); res.end('Forbidden'); 21. } else { 22. rs = fs.createReadStream(file); 23. rs.on('error', reportError); 24. res.writeHead(200);

17 par James Gaglo

Page 18: Serveur http

25. rs.pipe(res);

26. }

27. });

28. } else{

29. res.writeHead(404);

30. res.end('Not found');

31. }

32. });

33. }).listen(4000);

18 par James Gaglo

Page 19: Serveur http

Dans cet exemple, nous allons créer un serveur HTTP qui affiche du texte avec 100 sauts de ligne par seconde

1. require('http').createServer(function(req, res) { 2. res.writeHead(200, {'Content-Type': 'text/plain'}); 3. var left = 10; 4. var interval = setInterval(function() { 5. for(var i = 0; i< 100; i++) { 6. res.write(Date.now() + " "); 7. } 8. if (-- left === 0) { 9. clearInterval(interval); 10. res.end(); 11. } 12. }, 1000); 13. }).listen(4000);

19 par James Gaglo

Page 20: Serveur http

Professional Nodejs de Pedro Teixeira

docs.nodejitsu.com

http://nodejs.org/api/

20 par James Gaglo