En aquest tema, aprendrem com gestionar peticions i respostes en un servidor HTTP creat amb Node.js. Aquest és un aspecte fonamental per a qualsevol aplicació web, ja que permet la comunicació entre el client (navegador web) i el servidor.

Conceptes Clau

  1. HTTP: Protocol de Transferència d'Hipertext, utilitzat per a la comunicació entre clients i servidors.
  2. Petició HTTP: Sol·licitud enviada pel client al servidor, que pot incloure mètodes com GET, POST, PUT, DELETE, etc.
  3. Resposta HTTP: Resposta enviada pel servidor al client, que inclou un codi d'estat, capçaleres i un cos de resposta.

Crear un Servidor HTTP

Primer, crearem un servidor HTTP bàsic que pugui gestionar peticions i enviar respostes.

Exemple de Codi

const http = require('http');

// Crear un servidor HTTP
const server = http.createServer((req, res) => {
  // Establir l'estatus de la resposta i el tipus de contingut
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  
  // Enviar la resposta
  res.end('Hola, món!\n');
});

// El servidor escolta en el port 3000
server.listen(3000, '127.0.0.1', () => {
  console.log('Servidor en funcionament a http://127.0.0.1:3000/');
});

Explicació del Codi

  1. Importar el mòdul http: Utilitzem require('http') per importar el mòdul HTTP de Node.js.
  2. Crear el servidor: Utilitzem http.createServer() per crear un servidor HTTP. Aquesta funció pren un callback que s'executa cada vegada que el servidor rep una petició.
  3. Gestionar la petició i la resposta: Dins del callback, establim l'estatus de la resposta (res.statusCode = 200) i el tipus de contingut (res.setHeader('Content-Type', 'text/plain')). Finalment, enviem la resposta amb res.end('Hola, món!\n').
  4. Escoltar en un port: Utilitzem server.listen(3000, '127.0.0.1') per fer que el servidor escolti en el port 3000.

Gestionar Diferents Tipus de Peticions

Podem gestionar diferents tipus de peticions (GET, POST, etc.) utilitzant la propietat req.method.

Exemple de Codi

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'GET') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Has fet una petició GET\n');
  } else if (req.method === 'POST') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Has fet una petició POST\n');
  } else {
    res.statusCode = 405;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Mètode no permès\n');
  }
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Servidor en funcionament a http://127.0.0.1:3000/');
});

Explicació del Codi

  1. Comprovar el mètode de la petició: Utilitzem req.method per determinar el tipus de petició (GET, POST, etc.).
  2. Gestionar GET i POST: Si la petició és GET, enviem una resposta amb el missatge "Has fet una petició GET". Si és POST, enviem "Has fet una petició POST".
  3. Gestionar altres mètodes: Si la petició no és ni GET ni POST, enviem una resposta amb el codi d'estat 405 (Mètode no permès).

Gestionar Peticions amb Rutes

Podem gestionar diferents rutes utilitzant la propietat req.url.

Exemple de Codi

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'GET' && req.url === '/') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina d\'inici\n');
  } else if (req.method === 'GET' && req.url === '/sobre') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina sobre nosaltres\n');
  } else {
    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina no trobada\n');
  }
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Servidor en funcionament a http://127.0.0.1:3000/');
});

Explicació del Codi

  1. Comprovar la ruta de la petició: Utilitzem req.url per determinar la ruta de la petició.
  2. Gestionar diferents rutes: Si la petició és GET i la ruta és /, enviem una resposta amb el missatge "Pàgina d'inici". Si la ruta és /sobre, enviem "Pàgina sobre nosaltres".
  3. Gestionar rutes no trobades: Si la ruta no coincideix amb cap de les anteriors, enviem una resposta amb el codi d'estat 404 (Pàgina no trobada).

Exercicis Pràctics

Exercici 1: Crear un Servidor HTTP amb Diferents Rutes

  1. Crea un servidor HTTP que gestioni les següents rutes:
    • / (GET): Respon amb "Benvingut a la pàgina d'inici".
    • /contacte (GET): Respon amb "Pàgina de contacte".
    • /productes (GET): Respon amb "Llista de productes".
    • Qualsevol altra ruta: Respon amb "Pàgina no trobada" i el codi d'estat 404.

Solució

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'GET' && req.url === '/') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Benvingut a la pàgina d\'inici\n');
  } else if (req.method === 'GET' && req.url === '/contacte') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina de contacte\n');
  } else if (req.method === 'GET' && req.url === '/productes') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Llista de productes\n');
  } else {
    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina no trobada\n');
  }
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Servidor en funcionament a http://127.0.0.1:3000/');
});

Exercici 2: Gestionar Peticions POST

  1. Modifica el servidor anterior per gestionar peticions POST a la ruta /contacte. La resposta ha de ser "Formulari de contacte enviat".

Solució

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'GET' && req.url === '/') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Benvingut a la pàgina d\'inici\n');
  } else if (req.method === 'GET' && req.url === '/contacte') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina de contacte\n');
  } else if (req.method === 'POST' && req.url === '/contacte') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Formulari de contacte enviat\n');
  } else if (req.method === 'GET' && req.url === '/productes') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Llista de productes\n');
  } else {
    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Pàgina no trobada\n');
  }
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Servidor en funcionament a http://127.0.0.1:3000/');
});

Resum

En aquesta secció, hem après com gestionar peticions i respostes en un servidor HTTP creat amb Node.js. Hem vist com gestionar diferents tipus de peticions (GET, POST) i com treballar amb diferents rutes. Aquests conceptes són fonamentals per a la creació d'aplicacions web amb Node.js. En el següent tema, explorarem com servir fitxers estàtics des del nostre servidor.

Curs de Node.js

Mòdul 1: Introducció a Node.js

Mòdul 2: Conceptes Bàsics

Mòdul 3: Sistema de Fitxers i I/O

Mòdul 4: HTTP i Servidors Web

Mòdul 5: NPM i Gestió de Paquets

Mòdul 6: Framework Express.js

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats