Curso de




Día 7: net, http y request

Vuestro anfitrión


(según mi hija de 5 años)

Ingeniero senior en MediaSmart Mobile
Co-organizador de Node.js Madrid
@pinchito

Guión


  • streams
  • sesión práctica
  • net
  • Sesión práctica
  • http
  • Sesión práctica
  • request
  • Sesión práctica

Readable Stream (1/2)


readable.read([size]); 

Modo non-flowing: lee los bytes pedidos (como Buffer)

readable.on('data', callback) 

Modo flowing: recoge datos (como Buffer)

readable.on('error, callback) 

Caza los posibles errores


Fuente: stream

Readable Stream (2/2)


readable.pause(); 

Pausa la lectura

readable.resume();

Reanuda la lectura

readable.pipe(destination) 

enchufa la salida con la entrada de otro stream


Fuente: stream

Writable Stream


writable.write(data, [callback]); 

Escribe en un stream

writable.end([data], [callback]); 

Termina un stream

writable.on('finish', callback); 

Se lanza cuando se termina el stream


Fuente: stream

Duplex stream


Implementa tanto readable como writable stream


Ejemplos:


Sesión Práctica 1


Crear un fichero de texto


Comprimirlo

Luego descomprimirlo

Código de muestra


var gzip = zlib.createGzip();
var fs = require('fs');

var input = fs.createReadStream('input.txt');
var output = fs.createWriteStream('input.txt.gz');

input.pipe(gzip).pipe(output); 

Ejercicios


Mostrar el original mientras se comprime

Mostrar el resultado mientras se descomprime

Pausarlo durante un segundo
cada vez que se lea un trozo

Good job!


Net


No, not that net

net: servidor

net.createServer(options, listener) 

Crea un servidor

server.listen(port, [host], [callback]) 

Escucha en el puerto (y host opcional)

server.close([callback]) 

Deja de escuchar

server.unref() 

Termina el servidor si no quedan otros eventos


Fuente: net

net: Conexión

net.connect(options, listener) 

Crea una conexión (socket)

socket.write(data, [encoding], [callback]) 

Escribe por el socket

socket.close([callback]) 

Cierra la conexión

socket.setNoDelay() 

Deshabilita el algoritmo de Nagle (buffer e/s)


Fuente: net

sesión práctica 2


Crea un servidor de sockets


Enchufa la entrada con la salida...

comprimiendo los datos

Servidor de sockets


var net = require('net');
var port = 1702;
var server = net.createServer(function(connection) {
    console.log('Connection to %s open', port);
    connection.write('Hello?\r\n');
    connection.on('data', function(data) {
        if (String(data).trim() != 'hello) {
            connection.write('ERROR\r\n');
        } else {
            connection.end('world\r\n');
            console.log('Connection to %s closed', port);
        }
    });
});
server.listen(port);

Copia, pega y colorea

Ejercicio



Crea un programa que:

  • abra un socket,
  • lea un fichero,
  • lo envíe por el socket,
  • reciba la respuesta,
  • y la escriba a otro fichero.

Good job!

http


Sirve páginas

http Server


http.createServer([listener])

Devuelve un servidor, http.Server

server.on('request', function(request, response) {...}); 

Creado por cada petición

Recibe IncomingMessage y ServerResponse

(ambos streams)

request.headers

Cabeceras


Fuente: http

Http request


http.get(url, callback); 

Accede a una URL, devuelve una http.ClientRequest


Es un stream de lectura y escritura


Fuente: http.request

Http Agent


¡Cuidado con los agentes!


Pueden limitar las peticiones en curso


http.get({
    url: 'http://google.com/',
    agent: null,
}, callback); 


Fuente: agent

https


Casi el mismo API


Fuente: https

Sesión práctica 3


Crear un servidor http

con un API de control


Crear una prueba que:

  • arranque el servidor,
  • cree un cliente,
  • envíe una petición a /nop,
  • compruebe el resultado 200 y la página,
  • envíe otra petición,
  • compruebe el resultado 404

Especificación técnica


Servidor http, puerto 8000


Recibe una petición

devuelve HTTP 200 en la ruta /nop

y HTTP 404 en el resto


Devuelve tipo mime 'text/plain'

Página devuelta: 'OK ' + la ruta pedida


Good job!



request


Es triste pedir

Cliente http simplificado


var request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Print the google web page.
  }
})


Permite streaming:

request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))


Fuente: request

Más opciones


Options: url, headers y demás

request({
    url: 'http://google.com/',
    headers: {
        'user-agent': 'request,
    },
}, callback); 
        


Fuente: request


Sesión práctica 4


Crear un servidor proxy:

  • recibe una petición HTTP,
  • la envía a otro servidor,
  • lee la respuesta del otro
  • y la devuelve como suya.


Usar google.com

basic-request


Bajar la librería:

$ npm install basic-request 


Leer las instrucciones de uso


Usarla para bajar la página principal de Google

Good job!



Thanks!





Curso de Node.js Amaris: net, http y request

By Alex Fernández

Curso de Node.js Amaris: net, http y request

Curso para Amaris de Node.js, 2014-11-12: net, http y request

  • 2,507