En el mundo del desarrollo web, las APIs (Interfaces de Programación de Aplicaciones) son fundamentales para permitir la comunicación y el intercambio de datos entre diferentes sistemas y aplicaciones. Python, con su sintaxis clara y su gran cantidad de bibliotecas, es una excelente opción para crear APIs de manera rápida y eficiente. En este artículo, exploraremos cómo crear APIs en Python utilizando Flask, un microframework web ligero y flexible. Aprenderemos desde los conceptos básicos de una API hasta la implementación de una API funcional con rutas y métodos específicos.

Conceptos Básicos de una API

Una API (Interfaz de Programación de Aplicaciones) es un conjunto de reglas y especificaciones que permiten que diferentes aplicaciones se comuniquen entre sí. Actúa como un intermediario, facilitando la interacción entre sistemas, servicios o componentes de software sin necesidad de que conozcan los detalles internos de implementación del otro.

Tipos de APIs:

  • APIs REST (Representational State Transfer): Son las más comunes en el desarrollo web moderno. Se basan en principios de arquitectura RESTful, utilizando métodos HTTP (GET, POST, PUT, DELETE) para realizar operaciones sobre recursos.
  • APIs SOAP (Simple Object Access Protocol): Utilizan un protocolo más estricto y formal basado en XML para el intercambio de mensajes.
  • APIs GraphQL: Permiten a los clientes especificar exactamente qué datos necesitan, evitando la sobre-extracción de información.

Principios Clave de REST:

  • Cliente-Servidor: Separación clara entre la interfaz de usuario (cliente) y el almacenamiento de datos (servidor).
  • Sin estado (Stateless): Cada solicitud del cliente al servidor debe contener toda la información necesaria para ser procesada, sin que el servidor guarde información de sesión.
  • Cacheable: Las respuestas del servidor deben indicar si pueden ser cacheadas por el cliente para mejorar el rendimiento.
  • Interfaz Uniforme: Uso consistente de métodos HTTP, recursos identificados por URIs, y representación de datos en formatos estándar como JSON o XML.

Métodos HTTP Comunes:

  • GET: Obtiene un recurso.
  • POST: Crea un nuevo recurso.
  • PUT: Actualiza un recurso existente completamente.
  • PATCH: Actualiza parcialmente un recurso existente.
  • DELETE: Elimina un recurso.

Instalación y Configuración de Flask

Antes de comenzar a construir nuestra API, necesitamos instalar Flask y configurar nuestro entorno de desarrollo.

Instalación de Flask:

Puedes instalar Flask utilizando pip, el gestor de paquetes de Python:

pip install Flask

Entorno Virtual (Opcional pero Recomendado):

Es recomendable crear un entorno virtual para aislar las dependencias de tu proyecto. Puedes hacerlo con el siguiente comando:

python -m venv venv
# Activar el entorno virtual (Windows)
venv\Scripts\activate
# Activar el entorno virtual (macOS/Linux)
source venv/bin/activate

Estructura del Proyecto:

Una estructura de proyecto básica podría ser la siguiente:


my_api/
├── venv/        # Entorno virtual (opcional)
├── app.py       # Archivo principal de la API
└── README.md    # Documentación del proyecto

Archivo Principal (app.py):

Aquí tienes un ejemplo básico de un archivo app.py:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '¡Hola, Mundo!'

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

Explicación del Código:

  • Importamos la clase Flask desde el módulo flask.
  • Creamos una instancia de la aplicación Flask: app = Flask(__name__).
  • Definimos una ruta con el decorador @app.route('/'), que asocia la función hello_world a la ruta raíz (‘/’).
  • La función hello_world devuelve un mensaje que se mostrará en el navegador.
  • Finalmente, ejecutamos la aplicación en modo de depuración con app.run(debug=True). El modo de depuración permite que la aplicación se reinicie automáticamente cuando se detectan cambios en el código.

Ejecutar la Aplicación:

Para ejecutar la aplicación, guarda el archivo app.py y ejecuta el siguiente comando en tu terminal:

python app.py

Luego, abre tu navegador y visita http://127.0.0.1:5000/ (o la dirección que te indique la terminal) para ver el mensaje «¡Hola, Mundo!»

Creación de Rutas y Métodos

Las rutas y los métodos HTTP son la base de cualquier API RESTful. Definen cómo los clientes interactúan con los recursos de tu API.

Definición de Rutas:

En Flask, las rutas se definen utilizando el decorador @app.route(). Este decorador asocia una función a una URL específica.

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/users', methods=['GET'])
def get_users():
    users = [
        {'id': 1, 'name': 'Juan Perez'},
        {'id': 2, 'name': 'Maria Rodriguez'}
    ]
    return jsonify(users)

En este ejemplo, hemos definido una ruta /users que responde al método GET. La función get_users devuelve una lista de usuarios en formato JSON utilizando la función jsonify() de Flask.

Manejo de Diferentes Métodos HTTP:

Puedes definir diferentes funciones para manejar diferentes métodos HTTP en la misma ruta:

@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    # Lógica para crear un nuevo usuario en la base de datos
    return jsonify({'message': 'Usuario creado con éxito'}), 201

En este caso, la función create_user se ejecuta cuando se recibe una solicitud POST en la ruta /users. Utilizamos request.get_json() para obtener los datos enviados en el cuerpo de la solicitud en formato JSON. El código de estado 201 indica que el recurso fue creado con éxito.

Parámetros en la URL:

Puedes definir parámetros en la URL utilizando <nombre_parametro> en la definición de la ruta:

@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    # Lógica para obtener un usuario por su ID
    user = {'id': user_id, 'name': f'Usuario {user_id}'}
    return jsonify(user)

En este ejemplo, <int:user_id> define un parámetro llamado user_id que debe ser un entero. Flask automáticamente convierte el valor del parámetro a un entero y lo pasa a la función get_user.

Códigos de Estado HTTP:

Es importante devolver códigos de estado HTTP apropiados para indicar el resultado de la operación:

  • 200 OK: Operación exitosa.
  • 201 Created: Recurso creado con éxito.
  • 204 No Content: Operación exitosa, pero no hay contenido que devolver.
  • 400 Bad Request: Solicitud incorrecta.
  • 401 Unauthorized: No autorizado.
  • 403 Forbidden: Prohibido.
  • 404 Not Found: Recurso no encontrado.
  • 500 Internal Server Error: Error interno del servidor.

Ejemplo de API Funcional

Vamos a crear una API funcional que permita gestionar una lista de tareas (To-Do). Esta API tendrá las siguientes funcionalidades:

  • Obtener todas las tareas (GET /todos)
  • Obtener una tarea por su ID (GET /todos/<int:todo_id>)
  • Crear una nueva tarea (POST /todos)
  • Actualizar una tarea existente (PUT /todos/<int:todo_id>)
  • Eliminar una tarea (DELETE /todos/<int:todo_id>)

Código Completo:

from flask import Flask, jsonify, request

app = Flask(__name__)

todos = [
    {'id': 1, 'title': 'Aprender Flask', 'completed': False},
    {'id': 2, 'title': 'Construir una API', 'completed': False}
]

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

@app.route('/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
    todo = next((todo for todo in todos if todo['id'] == todo_id), None)
    if todo:
        return jsonify(todo)
    return jsonify({'message': 'Tarea no encontrada'}), 404

@app.route('/todos', methods=['POST'])
def create_todo():
    data = request.get_json()
    new_todo = {
        'id': len(todos) + 1,
        'title': data['title'],
        'completed': False
    }
    todos.append(new_todo)
    return jsonify(new_todo), 201

@app.route('/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
    todo = next((todo for todo in todos if todo['id'] == todo_id), None)
    if todo:
        data = request.get_json()
        todo['title'] = data.get('title', todo['title'])
        todo['completed'] = data.get('completed', todo['completed'])
        return jsonify(todo)
    return jsonify({'message': 'Tarea no encontrada'}), 404

@app.route('/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
    global todos
    todos = [todo for todo in todos if todo['id'] != todo_id]
    return jsonify({'message': 'Tarea eliminada con éxito'}), 200

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

Explicación del Código:

  • Inicializamos una lista de tareas llamada todos.
  • Definimos rutas para cada una de las funcionalidades mencionadas anteriormente.
  • Utilizamos next() con una expresión generadora para buscar una tarea por su ID.
  • Utilizamos request.get_json() para obtener los datos enviados en el cuerpo de la solicitud.
  • Devolvemos códigos de estado HTTP apropiados para cada operación.

Probar la API:

Puedes probar esta API utilizando herramientas como Postman o curl. Aquí tienes algunos ejemplos:

  • Obtener todas las tareas:
    curl http://127.0.0.1:5000/todos
  • Crear una nueva tarea:
    curl -X POST -H "Content-Type: application/json" -d '{"title": "Hacer la compra"}' http://127.0.0.1:5000/todos

 

En este artículo, hemos aprendido cómo crear APIs en Python utilizando Flask. Desde los conceptos básicos de una API hasta la implementación de una API funcional, hemos cubierto los aspectos clave para construir APIs RESTful de manera eficiente. Flask, con su simplicidad y flexibilidad, es una excelente opción para desarrollar APIs en Python, especialmente para proyectos pequeños y medianos. Con el conocimiento adquirido en este artículo, puedes empezar a construir tus propias APIs y a integrar tus aplicaciones con otros sistemas.

Ads Blocker Image Powered by Code Help Pro

Por favor, permite que se muestren anuncios en nuestro sitio web

Querido lector,

Esperamos que estés disfrutando de nuestro contenido. Entendemos la importancia de la experiencia sin interrupciones, pero también queremos asegurarnos de que podamos seguir brindándote contenido de alta calidad de forma gratuita. Desactivar tu bloqueador de anuncios en nuestro sitio nos ayuda enormemente a lograrlo.

¡Gracias por tu comprensión y apoyo!