En este módulo, aprenderemos sobre las APIs RESTful y cómo implementarlas utilizando Flask. Las APIs RESTful son una forma popular de construir servicios web que permiten la comunicación entre diferentes sistemas a través de HTTP. REST (Representational State Transfer) es un estilo arquitectónico que utiliza métodos HTTP estándar y se basa en recursos identificados por URLs.

Conceptos Clave

  1. REST (Representational State Transfer):

    • Es un estilo arquitectónico para diseñar servicios web.
    • Utiliza métodos HTTP estándar como GET, POST, PUT, DELETE.
    • Los recursos se identifican mediante URLs.
  2. Recursos:

    • Son entidades que se pueden acceder y manipular a través de la API.
    • Cada recurso tiene una URL única.
  3. Métodos HTTP:

    • GET: Recupera información de un recurso.
    • POST: Crea un nuevo recurso.
    • PUT: Actualiza un recurso existente.
    • DELETE: Elimina un recurso.
  4. JSON (JavaScript Object Notation):

    • Es un formato ligero de intercambio de datos.
    • Es fácil de leer y escribir para los humanos y fácil de parsear y generar para las máquinas.

Configuración Inicial

Antes de comenzar, asegúrate de tener Flask instalado en tu entorno de desarrollo. Si no lo tienes, puedes instalarlo usando pip:

pip install Flask

Creando una API RESTful Básica

Vamos a crear una API RESTful básica que maneje un recurso llamado books. Esta API permitirá realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) sobre los libros.

Paso 1: Configuración del Proyecto

Crea un nuevo directorio para tu proyecto y dentro de él, crea un archivo llamado app.py.

my_flask_api/
    └── app.py

Paso 2: Configuración de Flask

En app.py, configura una aplicación Flask básica:

from flask import Flask, jsonify, request

app = Flask(__name__)

# Datos de ejemplo
books = [
    {'id': 1, 'title': '1984', 'author': 'George Orwell'},
    {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}
]

@app.route('/')
def home():
    return "Welcome to the Book API!"

if __name__ == '__main__':
    app.run(debug=True)

Paso 3: Definiendo Endpoints RESTful

Obtener Todos los Libros (GET)

Añade un endpoint para obtener todos los libros:

@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books)

Obtener un Libro por ID (GET)

Añade un endpoint para obtener un libro específico por su ID:

@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is not None:
        return jsonify(book)
    else:
        return jsonify({'error': 'Book not found'}), 404

Crear un Nuevo Libro (POST)

Añade un endpoint para crear un nuevo libro:

@app.route('/books', methods=['POST'])
def create_book():
    new_book = request.get_json()
    new_book['id'] = len(books) + 1
    books.append(new_book)
    return jsonify(new_book), 201

Actualizar un Libro (PUT)

Añade un endpoint para actualizar un libro existente:

@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is not None:
        updated_data = request.get_json()
        book.update(updated_data)
        return jsonify(book)
    else:
        return jsonify({'error': 'Book not found'}), 404

Eliminar un Libro (DELETE)

Añade un endpoint para eliminar un libro:

@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [book for book in books if book['id'] != book_id]
    return '', 204

Código Completo

Aquí está el código completo de app.py:

from flask import Flask, jsonify, request

app = Flask(__name__)

# Datos de ejemplo
books = [
    {'id': 1, 'title': '1984', 'author': 'George Orwell'},
    {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}
]

@app.route('/')
def home():
    return "Welcome to the Book API!"

@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books)

@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is not None:
        return jsonify(book)
    else:
        return jsonify({'error': 'Book not found'}), 404

@app.route('/books', methods=['POST'])
def create_book():
    new_book = request.get_json()
    new_book['id'] = len(books) + 1
    books.append(new_book)
    return jsonify(new_book), 201

@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is not None:
        updated_data = request.get_json()
        book.update(updated_data)
        return jsonify(book)
    else:
        return jsonify({'error': 'Book not found'}), 404

@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [book for book in books if book['id'] != book_id]
    return '', 204

if __name__ == '__main__':
    app.run(debug=True)

Ejercicios Prácticos

  1. Añadir un Campo Nuevo:

    • Añade un campo genre a cada libro y actualiza los endpoints para manejar este nuevo campo.
  2. Manejo de Errores:

    • Mejora el manejo de errores para los endpoints de actualización y eliminación, asegurándote de que se devuelvan mensajes de error claros cuando un libro no se encuentra.
  3. Autenticación Básica:

    • Implementa una autenticación básica para proteger los endpoints de creación, actualización y eliminación de libros.

Conclusión

En esta lección, hemos aprendido los conceptos básicos de las APIs RESTful y cómo implementarlas utilizando Flask. Hemos creado una API básica que permite realizar operaciones CRUD sobre un recurso de libros. En las próximas lecciones, profundizaremos en temas más avanzados como la autenticación y la gestión de datos JSON.

Curso de Desarrollo Web con Flask

Módulo 1: Introducción a Flask

Módulo 2: Conceptos Básicos de Flask

Módulo 3: Formularios y Entrada de Usuario

Módulo 4: Integración de Bases de Datos

Módulo 5: Autenticación de Usuarios

Módulo 6: Conceptos Avanzados de Flask

Módulo 7: APIs RESTful con Flask

Módulo 8: Despliegue y Producción

Módulo 9: Pruebas y Mejores Prácticas

Módulo 10: Extensiones y Ecosistema de Flask

© Copyright 2024. Todos los derechos reservados