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
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
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);
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