En este tema, exploraremos los conceptos de recursos y URIs (Uniform Resource Identifiers) en el contexto de las APIs RESTful. Estos son componentes fundamentales para el diseño y la implementación de APIs RESTful efectivas y eficientes.
¿Qué es un Recurso?
En REST, un recurso es cualquier tipo de objeto, dato o servicio que puede ser accedido y manipulado a través de la API. Los recursos son las entidades principales que se exponen a través de la API y pueden representar:
- Datos: como usuarios, productos, pedidos, etc.
- Servicios: como operaciones de búsqueda, cálculos, etc.
Ejemplos de Recursos
- Usuarios: Información sobre los usuarios de una aplicación.
- Productos: Detalles de los productos en una tienda en línea.
- Pedidos: Información sobre los pedidos realizados por los usuarios.
¿Qué es un URI?
Un URI (Uniform Resource Identifier) es una cadena de caracteres que identifica de manera única un recurso en la web. En el contexto de las APIs RESTful, los URIs se utilizan para acceder a los recursos.
Estructura de un URI
Un URI típico tiene la siguiente estructura:
Donde:
http://
es el esquema.example.com
es el dominio./resource
es el camino que identifica el recurso.
Ejemplos de URIs
- Usuarios:
http://api.example.com/users
- Productos:
http://api.example.com/products
- Pedidos:
http://api.example.com/orders
Diseño de URIs
El diseño de URIs es crucial para la claridad y usabilidad de una API RESTful. A continuación, se presentan algunas prácticas recomendadas:
- Utilizar Nombres de Recursos en Plural
Es una práctica común utilizar nombres de recursos en plural para representar colecciones de recursos.
Ejemplo:
- Correcto:
/users
- Incorrecto:
/user
- Utilizar Verbos HTTP para Operaciones
En lugar de incluir verbos en los URIs, se deben utilizar los métodos HTTP (GET, POST, PUT, DELETE) para indicar la operación a realizar.
Ejemplo:
- Correcto:
GET /users
para obtener una lista de usuarios. - Incorrecto:
/getUsers
- Anidar Recursos Relacionados
Para representar relaciones jerárquicas entre recursos, se pueden anidar los URIs.
Ejemplo:
- Obtener pedidos de un usuario específico:
GET /users/{userId}/orders
- Utilizar Identificadores Únicos
Para acceder a un recurso específico, se deben utilizar identificadores únicos en los URIs.
Ejemplo:
- Obtener un usuario específico:
GET /users/{userId}
- Evitar Verbos en los URIs
Los URIs deben ser sustantivos que representen recursos, no verbos que representen acciones.
Ejemplo:
- Correcto:
/products
- Incorrecto:
/getProducts
Ejemplo Práctico
A continuación, se presenta un ejemplo práctico de cómo diseñar URIs para una API de una tienda en línea:
Recursos
- Usuarios:
/users
- Productos:
/products
- Pedidos:
/orders
Operaciones
- Obtener todos los usuarios:
GET /users
- Crear un nuevo usuario:
POST /users
- Obtener un usuario específico:
GET /users/{userId}
- Actualizar un usuario específico:
PUT /users/{userId}
- Eliminar un usuario específico:
DELETE /users/{userId}
Ejemplo de Código
from flask import Flask, jsonify, request app = Flask(__name__) # Datos de ejemplo users = [ {"id": 1, "name": "John Doe"}, {"id": 2, "name": "Jane Doe"} ] # Obtener todos los usuarios @app.route('/users', methods=['GET']) def get_users(): return jsonify(users) # Crear un nuevo usuario @app.route('/users', methods=['POST']) def create_user(): new_user = request.json users.append(new_user) return jsonify(new_user), 201 # Obtener un usuario específico @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = next((u for u in users if u["id"] == user_id), None) if user: return jsonify(user) else: return jsonify({"error": "User not found"}), 404 # Actualizar un usuario específico @app.route('/users/<int:user_id>', methods=['PUT']) def update_user(user_id): user = next((u for u in users if u["id"] == user_id), None) if user: updated_data = request.json user.update(updated_data) return jsonify(user) else: return jsonify({"error": "User not found"}), 404 # Eliminar un usuario específico @app.route('/users/<int:user_id>', methods=['DELETE']) def delete_user(user_id): global users users = [u for u in users if u["id"] != user_id] return '', 204 if __name__ == '__main__': app.run(debug=True)
Ejercicio Práctico
Ejercicio
Diseña los URIs para una API que maneje los siguientes recursos en una biblioteca:
- Libros: Información sobre los libros disponibles.
- Autores: Información sobre los autores de los libros.
- Préstamos: Información sobre los préstamos de libros.
Solución
-
Libros:
- Obtener todos los libros:
GET /books
- Crear un nuevo libro:
POST /books
- Obtener un libro específico:
GET /books/{bookId}
- Actualizar un libro específico:
PUT /books/{bookId}
- Eliminar un libro específico:
DELETE /books/{bookId}
- Obtener todos los libros:
-
Autores:
- Obtener todos los autores:
GET /authors
- Crear un nuevo autor:
POST /authors
- Obtener un autor específico:
GET /authors/{authorId}
- Actualizar un autor específico:
PUT /authors/{authorId}
- Eliminar un autor específico:
DELETE /authors/{authorId}
- Obtener todos los autores:
-
Préstamos:
- Obtener todos los préstamos:
GET /loans
- Crear un nuevo préstamo:
POST /loans
- Obtener un préstamo específico:
GET /loans/{loanId}
- Actualizar un préstamo específico:
PUT /loans/{loanId}
- Eliminar un préstamo específico:
DELETE /loans/{loanId}
- Obtener todos los préstamos:
Conclusión
En esta sección, hemos aprendido sobre los recursos y URIs en las APIs RESTful. Hemos discutido las mejores prácticas para diseñar URIs y hemos visto ejemplos prácticos de cómo implementarlos. Con estos conocimientos, estarás mejor preparado para diseñar y desarrollar APIs RESTful claras y efectivas. En el próximo tema, exploraremos los métodos HTTP y cómo se utilizan para interactuar con los recursos a través de las APIs RESTful.
Curso de REST API: Principios de Diseño y Desarrollo de APIs RESTful
Módulo 1: Introducción a las APIs RESTful
Módulo 2: Diseño de APIs RESTful
- Principios de diseño de APIs RESTful
- Recursos y URIs
- Métodos HTTP
- Códigos de estado HTTP
- Versionado de APIs
- Documentación de APIs
Módulo 3: Desarrollo de APIs RESTful
- Configuración del entorno de desarrollo
- Creación de un servidor básico
- Manejo de peticiones y respuestas
- Autenticación y autorización
- Manejo de errores
- Pruebas y validación
Módulo 4: Buenas Prácticas y Seguridad
- Buenas prácticas en el diseño de APIs
- Seguridad en APIs RESTful
- Rate limiting y throttling
- CORS y políticas de seguridad
Módulo 5: Herramientas y Frameworks
- Postman para pruebas de APIs
- Swagger para documentación
- Frameworks populares para APIs RESTful
- Integración continua y despliegue