En este proyecto final, aplicarás todos los conocimientos adquiridos a lo largo del curso para diseñar y desarrollar tu propia API RESTful. Este ejercicio te permitirá consolidar tus habilidades y obtener una experiencia práctica en el desarrollo de APIs.

Objetivos del Proyecto

  1. Diseñar una API RESTful que cumpla con los principios y buenas prácticas aprendidas.
  2. Implementar la API utilizando un framework de tu elección.
  3. Documentar la API para que otros desarrolladores puedan entender y utilizar tu API.
  4. Asegurar la API implementando autenticación y autorización.
  5. Probar y validar la API para asegurar su correcto funcionamiento.

Requisitos del Proyecto

  1. Diseño de la API

  • Definir los recursos: Identifica los recursos que tu API manejará. Por ejemplo, si estás creando una API para una biblioteca, los recursos podrían ser books, authors, y users.
  • Definir las URIs: Establece las URIs para cada recurso. Asegúrate de seguir las convenciones RESTful.
  • Elegir los métodos HTTP: Define qué métodos HTTP (GET, POST, PUT, DELETE) se utilizarán para cada operación en los recursos.
  • Definir los códigos de estado HTTP: Especifica los códigos de estado que tu API devolverá en diferentes situaciones.

  1. Implementación de la API

  • Configurar el entorno de desarrollo: Elige un framework y configura tu entorno de desarrollo.
  • Crear el servidor básico: Implementa un servidor básico que pueda manejar peticiones HTTP.
  • Implementar los endpoints: Desarrolla los endpoints para los recursos definidos.
  • Manejo de peticiones y respuestas: Asegúrate de que tu API maneje correctamente las peticiones y respuestas, incluyendo el manejo de errores.

  1. Documentación de la API

  • Utilizar herramientas de documentación: Usa herramientas como Swagger para documentar tu API.
  • Incluir ejemplos de uso: Proporciona ejemplos de cómo utilizar los endpoints de tu API.
  • Describir los parámetros y respuestas: Detalla los parámetros que tu API acepta y las respuestas que devuelve.

  1. Seguridad de la API

  • Implementar autenticación y autorización: Asegura tu API utilizando métodos de autenticación y autorización.
  • Proteger contra ataques comunes: Implementa medidas de seguridad para proteger tu API contra ataques como inyecciones SQL y XSS.

  1. Pruebas y Validación

  • Escribir pruebas unitarias: Desarrolla pruebas unitarias para asegurar que cada parte de tu API funciona correctamente.
  • Realizar pruebas de integración: Asegúrate de que los diferentes componentes de tu API funcionan bien juntos.
  • Validar entradas: Implementa validaciones para las entradas de los usuarios.

Ejemplo de Proyecto: API para una Biblioteca

  1. Diseño de la API

Recursos y URIs

Recurso URI Métodos HTTP
books /books GET, POST, PUT, DELETE
authors /authors GET, POST, PUT, DELETE
users /users GET, POST, PUT, DELETE

Ejemplo de Endpoints

  • GET /books: Obtener una lista de todos los libros.
  • POST /books: Añadir un nuevo libro.
  • PUT /books/{id}: Actualizar la información de un libro.
  • DELETE /books/{id}: Eliminar un libro.

Códigos de Estado HTTP

  • 200 OK: Petición exitosa.
  • 201 Created: Recurso creado exitosamente.
  • 400 Bad Request: Petición incorrecta.
  • 404 Not Found: Recurso no encontrado.
  • 500 Internal Server Error: Error del servidor.

  1. Implementación de la API

Configuración del Entorno

# Instalación de dependencias
npm install express body-parser mongoose

Creación del Servidor Básico

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

Implementación de Endpoints

const books = [];

app.get('/books', (req, res) => {
    res.status(200).json(books);
});

app.post('/books', (req, res) => {
    const book = req.body;
    books.push(book);
    res.status(201).json(book);
});

app.put('/books/:id', (req, res) => {
    const { id } = req.params;
    const updatedBook = req.body;
    books[id] = updatedBook;
    res.status(200).json(updatedBook);
});

app.delete('/books/:id', (req, res) => {
    const { id } = req.params;
    books.splice(id, 1);
    res.status(204).send();
});

  1. Documentación de la API

Ejemplo de Documentación con Swagger

swagger: '2.0'
info:
  version: "1.0.0"
  title: "Library API"
paths:
  /books:
    get:
      summary: "Get all books"
      responses:
        200:
          description: "A list of books"
    post:
      summary: "Add a new book"
      parameters:
        - in: "body"
          name: "book"
          description: "The book to add"
          required: true
          schema:
            type: "object"
            properties:
              title:
                type: "string"
              author:
                type: "string"
      responses:
        201:
          description: "Book added"
  /books/{id}:
    put:
      summary: "Update a book"
      parameters:
        - in: "path"
          name: "id"
          required: true
          type: "integer"
        - in: "body"
          name: "book"
          description: "The updated book"
          required: true
          schema:
            type: "object"
            properties:
              title:
                type: "string"
              author:
                type: "string"
      responses:
        200:
          description: "Book updated"
    delete:
      summary: "Delete a book"
      parameters:
        - in: "path"
          name: "id"
          required: true
          type: "integer"
      responses:
        204:
          description: "Book deleted"

  1. Seguridad de la API

Implementación de Autenticación

const jwt = require('jsonwebtoken');

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    // Verificación de usuario (simplificada)
    if (username === 'admin' && password === 'password') {
        const token = jwt.sign({ username }, 'secret_key');
        res.status(200).json({ token });
    } else {
        res.status(401).send('Unauthorized');
    }
});

const authenticate = (req, res, next) => {
    const token = req.headers['authorization'];
    if (token) {
        jwt.verify(token, 'secret_key', (err, decoded) => {
            if (err) {
                return res.status(401).send('Unauthorized');
            } else {
                req.user = decoded;
                next();
            }
        });
    } else {
        res.status(401).send('Unauthorized');
    }
};

app.use(authenticate);

  1. Pruebas y Validación

Pruebas Unitarias

const request = require('supertest');
const app = require('../app'); // Asumiendo que tu app está exportada en app.js

describe('GET /books', () => {
    it('should return a list of books', (done) => {
        request(app)
            .get('/books')
            .expect(200)
            .expect((res) => {
                res.body.should.be.an.Array();
            })
            .end(done);
    });
});

Conclusión

Este proyecto final te brinda la oportunidad de aplicar todos los conocimientos adquiridos durante el curso. Asegúrate de seguir cada paso cuidadosamente y de revisar los conceptos cuando sea necesario. Al finalizar este proyecto, habrás diseñado, desarrollado, documentado, asegurado y probado una API RESTful completa, lo que te preparará para enfrentar desafíos reales en el desarrollo de APIs.

© Copyright 2024. Todos los derechos reservados