Apidog

Plataforma de desarrollo de API colaborativa todo en uno

Diseño de API

Documentación de API

Depuración de API

Simulación de API

Prueba automatizada de API

Cómo construir y documentar APIs RESTful con Flask-RESTX y Apidog

Aprende a crear APIs RESTful con Flask-RESTX, validar datos y generar documentación interactiva. Prueba APIs fácilmente con Apidog. ¡Descarga Apidog gratis!

Daniel Costa

Daniel Costa

Updated on April 15, 2025

Construir APIs RESTful es una habilidad fundamental para el desarrollo web moderno, que permite una comunicación fluida entre clientes y servidores. Flask-RESTX, una extensión del popular framework Flask, simplifica este proceso proporcionando herramientas para crear APIs robustas de manera eficiente. En este tutorial, exploraremos cómo construir una API RESTful usando Flask-RESTX y demostraremos cómo probarla con Apidog, una plataforma integrada para el diseño de APIs, depuración, documentación, mocking y testing.

💡
Considera mejorar tu flujo de trabajo de desarrollo de APIs con Apidog. Es una herramienta integral que agiliza el diseño, la depuración, las pruebas y la documentación de APIs. Descarga Apidog gratis y sigue el tutorial para ver cómo se integra perfectamente en el proceso.
button

1. Introducción a las APIs RESTful

REST (Representational State Transfer) es un estilo arquitectónico que utiliza métodos HTTP estándar para interactuar con los recursos. Las APIs que se adhieren a los principios REST se denominan APIs RESTful. Proporcionan una interfaz predecible y uniforme para las interacciones cliente-servidor, lo que hace que los servicios web sean más accesibles y fáciles de mantener.

2. Configuración de tu entorno de desarrollo

Antes de empezar a construir nuestra API, configuremos nuestro entorno de desarrollo.

Prerrequisitos

Python 3.7 o superior: Asegúrate de que Python esté instalado en tu sistema. Verifícalo ejecutando:

python --version

Entorno Virtual: Es una buena práctica crear un entorno virtual para tu proyecto para gestionar las dependencias.

python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

Instalación de Flask y Flask-RESTX

Con el entorno virtual activado, instala Flask y Flask-RESTX usando pip:

pip install flask flask-restx

Este comando instala tanto Flask como Flask-RESTX, lo que nos permite construir y gestionar nuestros endpoints de API de manera efectiva.

3. Instalación y configuración de Flask-RESTX

Flask-RESTX es una extensión que añade soporte para construir rápidamente APIs REST con Flask. Fomenta las mejores prácticas con una configuración mínima.

Instalación

Si aún no has instalado Flask-RESTX, puedes hacerlo usando pip:

pip install flask-restx

Configuración

Crea un nuevo archivo Python, por ejemplo, app.py, y configura la configuración básica:

from flask import Flask
from flask_restx import Api

app = Flask(__name__)
api = Api(app, version='1.0', title='Sample API',
          description='A sample API using Flask-RESTX')

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

Este script inicializa una aplicación Flask y la envuelve con una instancia de API Flask-RESTX, proporcionando una base para construir endpoints.

4. Creación de tu primer endpoint de API

Creemos un endpoint simple para entender cómo funciona Flask-RESTX.

Definición de un Namespace

Los Namespaces en Flask-RESTX ayudan a organizar tu API y a prevenir colisiones de nombres de endpoints.

from flask_restx import Namespace, Resource

ns = Namespace('hello', description='Hello World operations')

Creación de un Recurso

Los Recursos en Flask-RESTX corresponden a endpoints y definen cómo se manejan los métodos HTTP.

@ns.route('/')
class HelloWorld(Resource):
    def get(self):
        return {'message': 'Hello, World!'}

Registro del Namespace

Finalmente, registra el namespace con la API:

api.add_namespace(ns)

Ahora, cuando ejecutes tu aplicación y navegues a http://localhost:5000/hello/, deberías ver:

{
  "message": "Hello, World!"
}

5. Estructuración de tu aplicación Flask-RESTX

A medida que tu aplicación crece, es esencial mantener una estructura limpia y organizada.

Diseño de Proyecto Recomendado

project/
├── app/
│   ├── __init__.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── hello_controller.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── hello_model.py
│   └── services/
│       ├── __init__.py
│       └── hello_service.py
├── run.py
└── requirements.txt

Inicialización de la Aplicación

En app/__init__.py:

from flask import Flask
from flask_restx import Api

def create_app():
    app = Flask(__name__)
    api = Api(app, version='1.0', title='Sample API',
              description='A sample API using Flask-RESTX')

    from .controllers.hello_controller import ns as hello_namespace
    api.add_namespace(hello_namespace)

    return app

En run.py:

from app import create_app

app = create_app()

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

Este enfoque modular separa las preocupaciones, haciendo que la aplicación sea más fácil de mantener y escalar.

6. Implementación de Operaciones CRUD

Las operaciones CRUD (Crear, Leer, Actualizar, Eliminar) son fundamentales para el desarrollo de APIs. Implementemos estas para un recurso Item simple.

Definición del Modelo

En app/models/item_model.py:

from flask_restx import fields

def get_item_model(api):
    return api.model('Item', {
        'id': fields.Integer(readOnly=True, description='The unique identifier of an item'),
        'name': fields.String(required=True, description='Item name'),
        'price': fields.Float(required=True, description='Item price')
    })

Implementación del Recurso

En app/controllers/item_controller.py:

from flask_restx import Namespace, Resource, reqparse
from app.models.item_model import get_item_model

ns = Namespace('items', description='Item operations')

item_model = get_item_model(ns)

items = []
item_id_counter = 1

parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Name of the item')
parser.add_argument('price', type=float, required=True, help='Price of the item')

@ns.route('/')
class ItemList(Resource):
    @ns.marshal_list_with(item_model)
    def get(self):
        return items

    @ns.expect(item_model)
    @ns.marshal_with(item_model, code=201)
    def post(self):
        global item_id_counter
        args = parser.parse_args()
        item = {
            'id': item_id_counter,
            'name': args['name'],
            'price': args['price']
        }
        items.append(item)
        item_id_counter += 1
        return item, 201

@ns.route('/<int:id>')
@ns.response(404, 'Item not found')
@ns.param('id', 'The item identifier')
class Item(Resource):
    @ns.marshal_with(item_model)
    def get(self, id):
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            return item
        ns.abort(404, message="Item not found")

    @ns.expect(item_model)
    @ns.marshal_with(item_model)
    def put(self, id):
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            args = parser.parse_args()
            item.update({
                'name': args['name'],
                'price': args['price']
            })
            return item
        ns.abort(404, message="Item not found")

    @ns.response(204, 'Item deleted')
    def delete(self, id):
        global items
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            items = [item for item in items if item['id'] != id]
            return '', 204
        ns.abort(404, message="Item not found")

En esta implementación:

  • GET /items/: Recupera la lista de elementos.
  • POST /items/: Agrega un nuevo elemento.
  • GET /items/{id}: Recupera un elemento específico por ID.
  • PUT /items/{id}: Actualiza un elemento existente por ID.
  • DELETE /items/{id}: Elimina un elemento por ID.

Esta configuración proporciona una interfaz CRUD completa para gestionar elementos en tu API.

7. Validación y Serialización de Datos con Flask-RESTX

La validación y serialización de datos son cruciales para garantizar la integridad y consistencia de los datos que procesa tu API. Flask-RESTX ofrece decoradores y campos para facilitar esto.

Uso de Modelos para la Validación

Define un modelo para especificar los formatos de entrada y salida esperados.

from flask_restx import fields

item_model = api.model('Item', {
    'id': fields.Integer(readOnly=True, description='The unique identifier of an item'),
    'name': fields.String(required=True, description='Item name'),
    'price': fields.Float(required=True, description='Item price')
})

Al decorar tus métodos de recurso con @ns.expect(item_model), Flask-RESTX validará automáticamente los datos JSON entrantes con este modelo.

Serialización de Respuestas

Usa el decorador @ns.marshal_with para formatear la salida de acuerdo con el modelo.

@ns.marshal_with(item_model)
def get(self, id):
    # Retrieve and return the item

Esto asegura que los datos de respuesta se adhieran a la estructura especificada, promoviendo la consistencia en toda tu API.

8. Testing  Probando APIs RESTful con Apidog

Las pruebas son una parte vital del desarrollo de APIs, asegurando que tus endpoints funcionen como se espera. Apidog es una herramienta integral que agiliza las pruebas, el diseño y la documentación de APIs.

Configuración de Apidog

Descarga e Instala: Descarga Apidog gratis y sigue las instrucciones de instalación para tu sistema operativo.

button

Crea un Nuevo Proyecto: Inicia Apidog y crea un nuevo proyecto para tu API.

Importación de tu Especificación de API

Si has documentado tu API usando OpenAPI/Swagger, puedes importar la especificación en Apidog:

Importar Especificación: En tu proyecto Apidog, selecciona la opción para importar una especificación de API y carga tu archivo OpenAPI.

Explorar Endpoints: Apidog analizará el archivo y mostrará tus endpoints de API, parámetros y modelos.

También puedes diseñar APIs desde cero en Apidog.

Prueba de Endpoints

Selecciona un Endpoint: Elige el endpoint que deseas probar de la lista.

Configura la Solicitud:

  • Método: Asegúrate de que el método HTTP correcto (GET, POST, PUT, DELETE) esté seleccionado.
  • Parámetros: Ingresa cualquier parámetro de consulta o variable de ruta requerida.
  • Encabezados: Establece los encabezados necesarios, como Content-Type: application/json.
  • Cuerpo: Para las solicitudes POST y PUT, proporciona la carga útil JSON.

Envía la Solicitud: Haz clic en el botón Send para ejecutar la solicitud.

Revisa la Respuesta:

(Consejo profesional: Apidog valida la respuesta de la API automáticamente.)

  • Código de Estado: Verifica que el código de estado de la respuesta coincida con las expectativas (por ejemplo, 200 para éxito, 201 para creación).
  • Cuerpo de la Respuesta: Comprueba que los datos devueltos sean correctos y estén formateados correctamente.
  • Encabezados: Inspecciona los encabezados de respuesta para obtener información adicional.

9. Generación de Documentación de API con Flask-RESTX

Una documentación completa es esencial para cualquier API, facilitando la facilidad de uso e integración para los desarrolladores. Flask-RESTX proporciona soporte integrado para generar documentación de API interactiva.

Generar documentación de API completa y fácil de usar es crucial para los desarrolladores y usuarios que interactúan con tu API. Flask-RESTX simplifica este proceso generando automáticamente documentación de Swagger UI, proporcionando una interfaz interactiva para explorar y probar tus endpoints de API.

Documentación Automática de Swagger

Por defecto, Flask-RESTX genera documentación de Swagger accesible en la URL raíz de tu API. Esta característica ofrece una visión general inmediata de la estructura de tu API y los endpoints disponibles sin configuración adicional.

Personalización de la Documentación con Decoradores

Flask-RESTX proporciona varios decoradores para mejorar y personalizar la documentación de tu API:

@api.doc(): Agrega información adicional a tus recursos o métodos. Por ejemplo, para documentar parámetros:

@api.route('/my-resource/<id>')
@api.doc(params={'id': 'An ID'})
class MyResource(Resource):
    def get(self, id):
        return {}

@api.response(): Documenta las respuestas esperadas, incluyendo códigos de estado y descripciones:

@api.route('/my-resource/<id>')
class MyResource(Resource):
    @api.response(403, 'Not Authorized')
    def post(self, id):
        api.abort(403)

@api.marshal_with(): Especifica el modelo de salida para una respuesta, asegurando un formato de datos consistente:

@api.route('/item/<int:id>')
class ItemResource(Resource):
    @api.marshal_with(item_model)
    def get(self, id):
        # Retrieve and return the item

@api.expect(): Define el modelo de entrada esperado para las solicitudes, facilitando la validación y la documentación:

@api.route('/item')
class ItemResource(Resource):
    @api.expect(item_model)
    def post(self):
        # Handle the post request

Organización con Namespaces

Los Namespaces en Flask-RESTX ayudan a agrupar recursos relacionados, mejorando la organización de tu API y su documentación.

from flask_restx import Namespace, Resource

ns = Namespace('items', description='Item operations')

@ns.route('/<int:id>')
class ItemResource(Resource):
    def get(self, id):
        # Retrieve and return the item

Al registrar el namespace con la API, todas las rutas y la documentación asociadas se agrupan adecuadamente:

api.add_namespace(ns)

Acceso a la Interfaz de Usuario de Swagger

Una vez que tu aplicación Flask-RESTX esté en ejecución, puedes acceder a la interfaz de usuario de Swagger generada automáticamente navegando a la URL raíz de tu API (por ejemplo, http://localhost:5000/). Esta interfaz proporciona una exploración interactiva de tu API, mostrando los endpoints disponibles, las entradas esperadas y las posibles respuestas.

Al aprovechar estas características, te aseguras de que tu API esté bien documentada, sea fácil de usar y sea fácilmente comprensible para los desarrolladores y consumidores por igual.

10. Mejora de la Documentación de la API con Apidog

Si bien Flask-RESTX proporciona documentación básica, Apidog ofrece funciones avanzadas para la documentación de la API, incluida la personalización, la generación automatizada de código y las pruebas en tiempo real.

Utiliza el editor visual de Apidog para definir los endpoints de tu API, los parámetros de solicitud y los esquemas de respuesta. Con un solo clic, genera documentación de API completa e interactiva.

Comparte tu documentación con los miembros del equipo o socios externos, permitiéndoles probar los endpoints de la API directamente dentro de la documentación.

Al integrar Flask-RESTX con Apidog, puedes crear APIs robustas con documentación de nivel profesional, mejorando tanto la eficiencia del desarrollo como la experiencia del usuario.

Conclusión

En esta guía completa, hemos explorado el proceso de construcción de APIs RESTful utilizando Flask-RESTX, una poderosa extensión para Flask que agiliza el desarrollo de APIs. Hemos cubierto temas esenciales como la configuración de tu entorno de desarrollo, la creación y gestión de endpoints de API, la validación y serialización de datos, y la generación de documentación de API interactiva.

Además, hemos presentado Apidog, una herramienta versátil que mejora tu flujo de trabajo de desarrollo de APIs al ofrecer características como pruebas automatizadas, pruebas de rendimiento y documentación colaborativa. Al integrar Apidog en tu proceso de desarrollo, puedes asegurar que tus APIs sean robustas, eficientes y estén bien documentadas.

button
Cómo usar Lovable AI (Alternativa a Cursor para desarrolladores web)Tutoriales

Cómo usar Lovable AI (Alternativa a Cursor para desarrolladores web)

Aprende a crear cualquier web con Lovable en esta guía completa. Descubre procesos paso a paso, funciones innovadoras e integra herramientas gratuitas como Apidog para gestión API.

Daniel Costa

April 15, 2025

Cómo usar n8n con servidores MCPTutoriales

Cómo usar n8n con servidores MCP

Automatiza flujos con n8n y servidores MCP para IA. Guía técnica: configuración, APIs, nodo "MCP Server Trigger" y Apidog para pruebas.

Daniel Costa

April 14, 2025

Cómo añadir claves API personalizadas a Cursor: Una guía completaTutoriales

Cómo añadir claves API personalizadas a Cursor: Una guía completa

Este tutorial te guiará para configurar y gestionar claves API personalizadas en Cursor (OpenAI, Anthropic, Google y Azure).

Daniel Costa

April 11, 2025