El protocolo HTTP en NodeJS
Podemos crear servidores HTTP en NodeJS con tan solo unas pocas líneas, de hecho es muy importante conocer bien los fundamentos de este módulo ya que de esa forma es mucho más sencillo comprender lo que puede ofrecernos este lenguaje.
Para comenzar vamos a levantar un servidor que muestre en pantalla un Hola Mundo, con el siguiente código:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('HOLA MUNDO\n'); }).listen(3000, "127.0.0.1"); console.log('Servidor ejecutandose en: http://127.0.0.1:3000/');
Con este pequeño programa, yendo por medio de la consola de comandos hasta donde se encuentre, debemos ejecutar:
node nombre.js
De esa forma desde el navegador si introducimos la dirección: http://127.0.0.1:3000/ vemos como aparece nuestro hola mundo.
Pero analicemos que es lo que ocurre aquí:
- Línea 1: se llama al módulo HTTP guardandolo en una variable, esto nos permitirá poder utilizar sus métodos cuando nos sean necesarios en el script
- Línea 2: se utiliza http.createServer para crear un nuevo objeto servidor
- A continuación el script entrega una función anónima al servidor Web indicandole que objeto servidor web debe de utilizar al recibir la petición. En nuestro caso responderá mostrando HOLA MUNDO y cerrando la petición.
- Línea 3: estamos enviando las cabeceras al servidor, diciendo que envíe como código de respuesta 200 (todo ok) y que se trata de un texto plano
- Línea 5: definimos el puerto y el host por el que vamos a acceder.
- Línea 6: solo hace que aparezca un mensaje por la consola de mando y de ese modo poder saber que está ocurriendo.
Se pueden comprobar las cabeceras de las respues utilizando diversas extensiones, dependiendo del navegador en el que nos encontremos:
Redireccionar en NodeJS
Seguramente ya sabemos hacer redirecciones web, tanto en JS, como HTML y PHP, pero tambien podemos hacerlas directamente con el protocolo HTTP en NodeJS.
Para ello enviamos al cliente un código de respuesta 301, indicándole que la página se ha movido a otra ubicación, y enviamos una cabecera Location Header con la decimos al cliente donde dirigirse, por ejemplo a mialtoweb.es
var http = require('http'); http.createServer(function (req, res) { res.writeHead(301, {'Location': 'http://mialtoweb.es/'}); res.end(''); }).listen(3000, "127.0.0.1"); console.log('Servidor ejecutandose en: http://127.0.0.1:3000/');
Vemos cómo hemos cambiado el envío de la cabecera en la línea 3 que ahora responde con un 301 y reacciona con un Location y donde queremos enviar al cliente.
Naturalmente en este caso no tenemos que enviar nada en el objeto.
Atendiendo diferentes peticiones
Si queremos que nuestro servidor sea capaz de responder a diferentes peticiones, tenemos que añadir rutas a la aplicación. Esto lo conseguimos en NodeJS por medio del módulo URL, el cual nos va a permitir leer una URL, pegarla y hacer lo que necesitemos con la salida que se genera.
Las rutas hacen referencias a las peticiones que atenderá la aplicación, por lo que tendremos que configurar la ruta para las peticiones que se soliciten.
En el siguiente ejemplo vamos a ver como podemos leer la url de una petición:
var url = require('url'); var requestURL = 'http://mialtoweb.es/sobre-mi/'; var respuesta = url.parse(requestURL).hostname; var respuesta2 = url.parse(requestURL).port; var respuesta3 = url.parse(requestURL).pathname; console.log(respuesta); console.log(respuesta2); console.log(respuesta3);
Aquí lo que hacemos es llamar al módulo URL, luego creamos una variable donde introducimos la url y después vamos a recibir un valor dependiendo de si queremos trabajar con el hostname, el puerto o el pathname.
El resultado que veremos por consola sería:
De hecho con este módulo podemos analizar todos los detalles de una url, pero eso se nos escapa un poco de nuestro objetivo. de todas formas en la documentación oficial de node sobre la api de URL podemos ver hasta donde podemos introducirnos.
Con esto podemos ir pensando en la forma de crear la estructura de la web y en como el servidor puede empezar a responder dependiendo de la url que reciba. Veámoslo.
var http = require('http'), url = require('url'); http.createServer(function (req, res) { var pathname = url.parse(req.url).pathname; if (pathname === '/') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Inicio\n') } else if (pathname === '/sobre') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Sobre Nosotros\n') } else if (pathname === '/redireccion') { res.writeHead(301, { 'Location': '/' }); res.end(); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Pagina no encontrada\n') } }).listen(3000, "127.0.0.1"); console.log('El servidor esta corriendo en http://127.0.0.1:3000/');
En este script lo primero que hacemos es llamar a los módulos que necesitamos; HTTP para levantar el servidor y URL para jugar con las direcciones.
Como en los ejemplos anteriores, creamos el objeto servidor, pero en la línea 5 vemos que recogemos el pathname de la url que tenemos escrita, de este modo entramos en una estructura ifelse donde comparamos con el operador idéntico ( === ) el pathname.
De este modo si es / mostrará inicio, si es /sobre entrara en sobre nosotros, si recibe redireccion entraremos en una cabecera 301 y si no coincide con nada pues recibe un error 404 mostrando página no encontrada .
No hay que imaginar mucho para darse cuenta del potencial que tiene esto, de hecho a estas alturas ya podemos imaginar un poco el potencial de NodeJS, pero todavía hay más…
Creando clientes HTTP en NodeJS
No solo podemos crear servidores en NodeJS, también podemos crear clientes, más allá de los navegadores, podemos ver como clientes a los robots de buscadores, clientes de correo electrónico o analizadores de páginas Web.
Para crear clientes necesitamos el módulo HTTP (de esto va la entrada ¿no?), el cual tiene un método http.get que nos permite realizar peticiones GET al servidor.
Para utilizarlo necesitaremos detalles como el host, el número de puerto y la ruta.
Esto que parece muy complicado, en realidad es muy simple…
var http = require('http'); var options = { host: 'mialtoweb.es', port: 80, path: '/' }; http.get(options, function(res) { if (res.statusCode == 200) { console.log("El sitio funciona!"); } else { console.log("El sitio esta caido!"); } }).on('error', function(e) { console.log("Hay un error: " + e.message); });
Como vemos llamamos al módulo HTTP y a continuación creamos nuestro objeto de opciones que es introducido en el método http.get junto con una función anónima (¿os acordáis de los callbacks?). Esto hace que recibamos una respuesta, si esta es 200 el sitio funciona y si no lo es pues entonces está caído.
De esta forma hemos creado nuestro primer cliente, pero seguro que no será el último.
Con esto vemos el potencial que tiene el módulo HTTP en NodeJS, abriéndonos a un infinito espectro de posibilidades de programación. De hecho cuando estaba viéndolo por primera vez me quedé asombrado de la facilidad de trabajo que puede llegar a tener.
There are 2 Comments.