Documente Academic
Documente Profesional
Documente Cultură
1º DAM 18/19
GraphQL: Introducción
✔ Queries
✔ Mutations
✔ Subscriptions
✔ Esquema SDL
✔ Arquitectura
✔ Selectores múltiples
INTRODUCCIÓN
Core concepts
GraphQL tiene su propio sistema de tipos que es utilizado para definir el “esquema de
una API”.
Las reglas de sintaxis para escribir el esquema son llamadas Schema Definition
Language (SDL)
https://blog.graph.cool/graphql-sdl-schema-definition-language-6755bcb9ce51
GraphQL
Core concepts
Un ejemplo de como usamos el SDL para definir un type simple llamado Person
Core concepts
También se pueden definir relaciones entre tipos, por ejemplo, en un blog tendríamos una
relación entre los Post y la Persona que lo ha escrito
type Post {
title: String! Aquí tenemos definida una relación One-to-
author: Person! many (uno a muchos) entre Person y Post ya
} que en Person el campo posts es un array de
Posts
type Person {
name: String!
age: Int!
posts: [Post!]!
}
GraphQL
Debido a que la estructura de datos que devuelve graphQL no es fija solo se utiliza un
único endpoint (al contrario que en los servicios REST).
La desventaja es que al tener un único endpoint el cliente debe enviar más
información al servidor para especificar los datos que necesita, esto se consigue
mediante queries
GraphQL
{
allPersons { Root field: campo raiz de la query
name Payload: todo lo que sigue al root
}
}
GraphQL
{
{ "allPersons": [
allPersons { { "name": "Johnny" },
name { "name": "Sarah" },
} { "name": "Alice" }
} ]
}
GraphQL
Una de las grandes ventajas de GraphQL sobre REST es que nos provee de la
capacidad de hacer querys sobre información relacionada (relaciones one-to-many por
ejemplo).
Si buscamos cargar los datos de todos los post que una persona ha escrito tan solo
tienes que seguir la estructura de tus tipos (SDL) para solicitar la información
GraphQL
{
allPersons { En esta query solicitamos información sobre
name el nombre de todas las personas y los títulos
age de los Post que ha escrito.
posts {
title Como habíamos definido en nuestra SDL
}
}
}
GraphQL
{
allPersons(last: 2) {
name
}
}
GraphQL
{
"data": {
"allPersons": [
{ {
allPersons(last: 2) { "name": "Sarah"
name },
} {
} "name": "Alice"
}
]
}
}
GraphQL
Hasta aquí hemos visto como solicitar datos pero la mayor parte de las
aplicaciones también necesitan realizar cambios en los datos del backend.
En GraphQL esto se logra con las mutaciones, existen tres tipos:
La mutaciones siguen la misma estructura sintáctica que las queries, pero siempre
necesitan comenzar con la palabra clave “mutation”.
Un ejemplo para Person:
mutation { "createPerson": {
createPerson(name: "Bob", age: 36) { "name": "Bob",
name "age": 36,
age }
}
}
GraphQL
mutation {
createPerson(name: "Bob", age: 36) { Root field
name Payload
age Payload
}
}
Las mutaciones también admiten payloads: es posible solicitar datos a la vez que
realizamos una mutación
GraphQL
En el ejemplo anterior no resultaba muy útil recibir los mismos datos que
habíamos creado, puesto que ya sabíamos cuales eran.
Un ejemplo de aplicación útil → Cuando creamos un registro se suele crear con un
id, podemos utilizar un payload para recibir este id que antes no teníamos
Para algunas aplicaciones es importante tener una conexión en tiempo real con el
servidor para estar informado sobre eventos. Para esto GraphQL ofrece el concepto de
“suscripciones (subscriptions)”
Cuando un cliente se suscribe a un evento se inicia una conexión con el servidor y
cuando el evento se dispara (ocurre) el servidor envía los datos correspondientes al
client. Esto no sigue un ciclo típico de request-response, las suscripciones representan
un stream de datos enviados hacia el cliente.
Las suscripciones se escriben siguiendo la misma sintaxis que las queries y mutations.
GraphQL
Cuando se
subscription { {
produzca una
newPerson { "newPerson": {
mutación el
name "name": "Jane",
servidor enviará la
age "age": 23
información sobre
} }
este cambio al
} }
servidor
GraphQL
El esquema es una de las partes más importantes cuando trabajamos con graphQL.
En el esquema se especifican las capacidades del API y se define la forma en que los
clientes pueden preguntar por los datos. Es un contrato entre el servidor y el cliente.
Un escquema es una colección de tipos graphQL. Cuando escribimos el esquema hay
algunos tipos especiales que son raiz (root) ya vistos en la presentación.
Este será el esquema completo para las peticiones de Person y Post de las páginas
anteriores
Arquitectura
https://www.howtographql.com/basics/3-big-picture/
GraphQL
Arquitectura
GraphQL
Arquitectura
GraphQL
Arquitectura
GraphQL
Clients
GaphQl proporciona facilidades del lado del cliente de forma que nos podremos
concentrar en lo que realmente importa
https://www.howtographql.com/advanced/0-Client/
GraphQL
Cliente
https://www.howtographql.com/advanced/0-Client/
GraphQL
https://www.howtographql.com/advanced/0-Client/
GraphQL
https://www.howtographql.com/advanced/0-Client/
GraphQL
https://dev-blog.apollodata.com/the-concepts-of-graphql-bc68bd819be3
https://www.howtographql.com/advanced/0-Client/
GraphQL
Debido al diseño de graphQL, con un esquema que contiene toda la información sobre lo
que el cliente puede demandar, se puede validar y optimizar todas las peticiones en el
momento de la compilación
Cuando el entorno de desarrollo (IDE) tiene acceso al esquema puede parsear todo el
código del proyecto y compararlo contra la información del esquema.
Se pueden detectar errores antes de que la aplicación llegue al cliente
https://www.howtographql.com/advanced/0-Client/
GraphQL
Más conceptos
https://www.howtographql.com/advanced/2-more-graphql-concepts/
GraphQL
Servidor
https://dev-blog.apollodata.com/graphql-explained-5844742f195e
GraphQL
Herramientas
https://graphql.org/community/
ENLACES
https://graphql.org/
https://www.howtographql.com/
https://graphql.org/code/