Que Es GraphQL?
GraphQL es un lenguaje de consulta para APIs desarrollado por Facebook (Meta) en 2012. A diferencia de REST donde el servidor define que datos retorna cada endpoint, GraphQL permite al cliente especificar exactamente que campos necesita.
GraphQL vs. REST
| Caracteristica | REST | GraphQL |
|---|---|---|
| Endpoints | Multiples (/users, /posts) | Uno solo (/graphql) |
| Obtencion de datos | Servidor decide la forma | Cliente especifica campos |
| Over-fetching | Comun | Eliminado |
| Under-fetching | Requiere multiples requests | Resuelto con queries anidados |
| Versionado | URL/header | Evolucion de schema |
| Caching | HTTP cache integrado | Mas complejo |
Conceptos Fundamentales
Queries — leer datos (equivalente a GET):
query {
user(id: 42) {
name
email
posts {
title
createdAt
}
}
}
Mutations — escribir datos (equivalente a POST/PUT/DELETE):
mutation {
createUser(input: { name: "Alice", email: "alice@example.com" }) {
id
name
}
}
Subscriptions — actualizaciones en tiempo real via WebSocket:
subscription {
newMessage(chatId: "123") {
content
sender { name }
}
}
Schema de GraphQL
El schema define todos los tipos, queries y mutations disponibles:
type User {
id: ID!
name: String!
email: String!
role: Role!
posts: [Post!]!
}
enum Role { ADMIN USER VIEWER }
type Query {
user(id: ID!): User
users(limit: Int, offset: Int): [User!]!
}
type Mutation {
createUser(input: CreateUserInput!): User!
deleteUser(id: ID!): Boolean!
}
El ! significa que el campo no es nullable. Usa introspeccion para explorar la API:
{
__schema {
types { name fields { name type { name } } }
}
}
Testing de Queries GraphQL
Tests de Validacion de Query
| Test | Input | Esperado |
|---|---|---|
| Query valido | { user(id: 42) { name } } | 200 con campos solicitados |
| Campo inexistente | { user(id: 42) { phone } } | Error: campo no encontrado |
| Argumento requerido faltante | { user { name } } | Error: id requerido |
| Tipo de argumento incorrecto | { user(id: "abc") { name } } | Error: tipo incorrecto |
| Query vacio | {} | Error de sintaxis |
Validacion de Response
- Solo campos solicitados retornados
- Campos non-nullable nunca son null
- Tipos array retornan arrays (incluso vacios)
- Valores enum coinciden con el schema
Testing de Mutations
mutation {
createUser(input: { name: "Alice", email: "alice@example.com", role: USER }) {
id name email
}
}
Escenarios de Test de Mutations
| Escenario | Esperado |
|---|---|
| Input valido | Exito con recurso creado |
| Campo requerido faltante | Error de validacion |
| Valor enum invalido | Error: Role invalido |
| Campo unico duplicado | Error de conflicto |
| Mutation no autorizada | Error de auth |
Testing de Seguridad Especifica de GraphQL
Ataque de Profundidad de Query
{ user(id: 1) { posts { author { posts { author { posts { author { name } } } } } } } }
Test: Envia queries con profundidad creciente. Verifica que el servidor rechace queries que excedan el limite.
Ataque de Complejidad de Query
{ users(limit: 10000) { posts(limit: 1000) { comments(limit: 1000) { author { name } } } } }
Test: Verifica limites de complejidad de query.
Introspeccion Deshabilitada en Produccion
{ __schema { types { name } } }
Test: Verifica que queries de introspeccion fallen en produccion.
Ataque de Batch Query
Test: Verifica limites de batch y que rate limiting aplique a operaciones en lote.
Herramientas de Testing para GraphQL
| Herramienta | Proposito |
|---|---|
| GraphiQL / Playground | Explorador interactivo |
| Postman | Soporta queries GraphQL |
| Altair GraphQL Client | Cliente GraphQL completo |
| graphql-inspector | Diff y validacion de schema |
Ejercicio Practico
- Explora una API GraphQL: Usa la Star Wars API GraphQL para enviar queries y explorar el schema.
- Testea mutations: Con una API GraphQL escribible, testea operaciones CRUD.
- Testing de seguridad: Envia queries profundos y de introspeccion.
- Compara REST vs GraphQL: Obtene los mismos datos con ambos enfoques.
Puntos Clave
- GraphQL permite a los clientes solicitar exactamente los datos que necesitan
- El testing requiere validar queries, mutations, schema y seguridad especifica de GraphQL
- Limites de profundidad, complejidad e introspeccion deshabilitada son medidas criticas
- El problema N+1 es comun en performance — monitorea queries de resolvers
- La introspeccion es poderosa para diseno de tests pero debe deshabilitarse en produccion