Tutorial: Integrar OpenAI API en Python paso a paso
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Comparativa práctica entre REST y GraphQL con ejemplos en Python. Ventajas, desventajas y criterios de decisión para tu próximo proyecto.
Dos formas de construir APIs, cada una con sus ventajas. Esta guía te da criterios claros para elegir en tu próximo proyecto.
GET /api/users/123 → Un usuario
GET /api/users/123/posts → Posts del usuario
GET /api/posts/456/comments → Comentarios del post
Problema: 3 requests para mostrar un perfil con posts y comentarios (over-fetching + under-fetching).
query {
user(id: 123) {
name
email
posts(limit: 5) {
title
createdAt
comments(limit: 3) {
content
author { name }
}
}
}
}
Un solo request, solo los campos que necesitas. Nada más, nada menos.
| Aspecto | REST | GraphQL |
|---|---|---|
| Endpoints | Múltiples (/users, /posts, etc.) | Uno solo (/graphql) |
| Over-fetching | Común (recibes campos que no usas) | No existe (pides solo lo que necesitas) |
| Under-fetching | Común (necesitas múltiples requests) | No existe (anidas relaciones) |
| Caching | HTTP nativo (CDN, browser, ETags) | Requiere librerías (Apollo) |
| Versionado | /api/v1/, /api/v2/ | No necesario (deprecas campos) |
| Upload de archivos | Nativo (multipart/form-data) | Complejo (spec separada) |
| Documentación | OpenAPI/Swagger | Introspection + Playground |
| Curva de aprendizaje | Baja | Media-alta |
from fastapi import FastAPI
app = FastAPI()
@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
user = await User.get(user_id)
return {"id": user.id, "name": user.name, "email": user.email}
@app.get("/api/users/{user_id}/posts")
async def get_user_posts(user_id: int, limit: int = 10):
posts = await Post.filter(author_id=user_id).limit(limit)
return posts
import strawberry
from strawberry.fastapi import GraphQLRouter
@strawberry.type
class UserType:
id: int
name: str
email: str
@strawberry.field
async def posts(self, limit: int = 10) -> list["PostType"]:
return await Post.filter(author_id=self.id).limit(limit)
@strawberry.type
class Query:
@strawberry.field
async def user(self, id: int) -> UserType:
return await User.get(id)
schema = strawberry.Schema(query=Query)
graphql_app = GraphQLRouter(schema)
Para el 90% de los proyectos, REST es suficiente y más simple. Usa GraphQL cuando el frontend genuinamente lo necesite por la complejidad de los datos, no porque esté de moda.
Este recurso incluye un enlace externo. Regístrate para acceder.
Regístrate gratis para descargar archivos, guardar recursos en favoritos, ganar XP y acceder a cursos y el foro de la comunidad.
¿Ya tienes cuenta? Inicia sesión
Autor
Erik Taveras
Creado por
Erik Taveras
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Implementación paso a paso de Stripe Checkout para cobros únicos y suscripciones en Django. Incluye webhooks, portal del cliente y manejo de estados.
Construye un chatbot que recuerda conversaciones anteriores usando Redis como almacén de memoria. Cada usuario tiene su propio historial persistente.