Es un query language, es decir, un lenguaje de consultas. Un lenguaje es un sistema compartido por dos partes que les permite comunicarse entre sí.
Un lenguaje de consultas como GraphQL nos permite hacer consultas y esperar una respuesta predecible. Un ejemplo de una lenguaje de consultas es SQL, el cual se enfoca en las consultas a una base de datos.
Aunque suene un poco confuso, SQL no tiene nada que ver con GraphQL, ya que el primero está pensado para trabajar con bases de datos, y GraphQL es para comunicar clientes y servidores.
GraphQL es una herramienta que se presenta como una alternativa a REST. La principal mejora que propone es la optimización, además de trasladar la información del servidor al cliente.
Una de las ventajas más importantes de GraphQL es que es agnóstico de plataforma, lo que quiere decir que se puede implementar en más de 20 lenguajes.
El principal objetivo de GraphQL es evitar las múltiples consultas al servidor.
ApiRest
Es solo una convención: Es una manera de comunicarse entre el servidor y cliente, cada uno tiene sus reglas.
El servidor expone recursos: Los clientes se tienen que adecuarse a como están expuestos.
Hace overfetching: Envía más información de la que se necesita.
Múltiples request por vista: Muy costoso en performance, básicamente es una aplicación en blanco que aún no ha cargado datos o tiene custom endpoints.
Documentación ajena al desarrollo: No hay un estándar por lo que depende mucho del desarrollador para mantenerla.
GraphQL
Lenguaje tipado y validable: Le damos una forma de lo que recibe y lo que devolvemos, Además de agregarle seguridad.
El Cliente define que recibe: Haciendo una consulta, de la estructura que se define como respuesta.
Envía lo necesario: Se tiene control total de las respuestas que se esperan del servidor.
Hace un solo request por vista: Se maneja un solo row, prácticamente en solo request puedes mandar todo lo que necesitas.
El manejo de esquemas dentro de GQL(GraphQL) facilita la forma en la que se deciden las entidades, cómo se relacionan entre ellas, cuáles son las entidades que están disponibles para cada cliente, en pocas palabras, es todo lo que el cliente puede pedir a través de GQL, Un punto importante a tomar en cuenta es que los Schemas están compuestos de types los cuales se conocen como scalars.
<h1>Scalars</h1>Permiten definir la mayoría de las propiedades de las entidades que utilizaremos, los tipos que nos permite manejar son
Permite definir las entidades que conforman nuestro esquema por ejemplo.
// al usar Type indica que esto es un objeto
type Curso {
// al usar el signo ! indica que // el valor es obligatrioid: ID!
descripcion: String// la utilizar [] indica que es una lista// los que nos indica que puedes tener 1 o mas // profesoresprofesores: [Profesor]
}
type Profesor {
id: ID!
nombre: Stringedad: Int
tieneCurso: Boolean
}****
También es conocido como enumeradores, los cuales permiten listar entre una o varias opciones posibles, ejemplo.
// al usar emun indica el inicio del tipo emumenumCurso{
// Listado de las opciones posibles
REACT
GRAPHQL
REDUX
}
Proporciona la capacidad de describir campos que se comparten en diferentes tipos, es la definición de campos requeridos que sabemos que todas las implementaciones se van a cumplir, si en un futuro necesitáramos que todas las implementaciones de perfil tuvieran un nuevo campo, solamente debemos agregarlo a la Interface.
// Al usar interface se indica el uso de interface
interface Perfil {
// para este ejemplo se setea// el uso de campos obligadosnombre: String!
email: String!
edad: Int!
}
// Al usar implements se indica que usar al interface Perfil
type Alumno implements Perfil {
// De igual manera tenemos que declarar// los cambpos que se utilizan en la interfacenombre: String!
email: String!
edad: Int!
cruso: String
}
Permite agrupar diferentes tipos en los cuales se puede realizar una búsqueda siempre dentro de los tipos agrupados, ejemplo.
// Al usar union se indica que busqueda es tipo union
union Busqueda = Profesor | Curso
// Objecto en el que se realiza la busqueda
type Curso {
id: ID!
descripcion: Stringprofesores: [Profesor]
}
// Objecto en el que se realiza la busqueda
type Profesor {
id: ID!
nombre: Stringedad: Int
tieneCurso: Boolean
}
// Objecto que muestra el resultado de la busqueda
type QueryBusqueda {
// Al usar [] indica que puede ser 1 o mas valores// practicamente puede ser una listaresults: [Busqueda]
}
Dentro de GQL existen dos tipos de modificadores los cuales son.
typeProfesor {
name: String!
}
typeProfesor {
name: String!
cursos: [String]
}
Algo interesante de los 2 modificadores de tipo pueden utilizarse juntos por ejemplo.
type Profesor {
name: String!
// Para este caso se indica que la lista no puedeser null// pero si la lista recibe algo como esto [null, "jorge", null]// seria valido.cursos: [String]!
}
En el ejemplo anterior se indica que la lista no puede ser null ya que es requerida pero dentro de la lista si pueden existir valores null por lo que seria valido y no se mostraría un Error.
type Profesor {
name: String!
// Para este caso se indica que la lista no puedeser null// al igual que el contenido por lo que si la lista// algo como esto [null, "jorge", null] no seria valido.cursos: [String!]!
}
Es el punto de entrada para realizar las consultas, se puede ver como una analogía a los endpoints que encontramos dentro de una arquitectura REST, un punto importante dentro de GQL es que solo existe un solo punto de entrada.
// Esta declaracion es epsecial ya que // Dicta el unicio punto de entrada
Type Query {
// Dentro se colocan los puntos de entrada// y se le asignan las entidades a las cuales// puedes tener accesocursos: [Curso]
profesores: [Profesores]
// Tabien dentro de los puntos de entrada se le pueden // mandar parametros para resolver querys es importante // mencionar que al resilver un query se tiene que indicar // en que entidad se resuelve dicho query.
curso(id: String!): Curso
profesor(id: String!, limite: init): Profesores
}
GQL no solo permite realizar consultas sino que también tiene la capacidad de insertar, Borrar y editar elementos, GQL nos facilita un tipo especial de endPoint el cual nos permite realizar las acciones ya mencionadas.
// punto de entrada especial que permite// agregar, modificar y borrar contenido typeMutation {
// Declaracuon del punto de entradaagregarCurso {
// De claracion de los campos a modificar o agregardescripcion: String
profesorId: String
} : Curso// identidad a la que se le agregaran los nuevos campos
}
Antes de entender cómo se manejan la variables es importante decir y saber que en GQL no puedes tener nada sin saber de qué tipo es por lo cual es importante tomar en cuenta los saclars, en el siguiente ejemplo se muestra el uso de variables.
En la imagen anterior podemos ver que se declara la variable id la cual se pasa de manera directa al query como se muestra en la **Línea 1, GQL **permite el manejo de queries ya que cuenta con una sintaxis propia la cual se muestra en el siguiente ejemplo.
{
[nombre Entidad] {
// listado de campos a solicitar
}
}
// ejemplo query base
{
cursos {
id,
titulo,
}
}
el ejemplo anterior es un query básico ya que GQL nos permite realizar búsquedas un poco más complejas y extensas por ejemplo supongamos el siguiente caso.
Como podemos ver en la imagen se muestra una relación de la tabla cursos con la tabla comentarios al iniciar el uso de**_ GQL_** podemos resolver la consulta de una manera muy sencilla.
{
[nombre Entidad] {
// listado de campos a solicitar
[nombre de entidar con laquese tiene realción] {
// listado de campos a solicitar
}
}
}
// ejemplo de consulta consiguiendo data de una relación
{
cursos {
id,
titulo,
comentarios {
nombre
cuerpo
}
}
}
Como hemos podido ver, GQL nos da herramientas para desarrollar un API de forma rápida, natural e independiente del acceso a base de datos o en algunos casos conectarnos a un CMS. Además soporta una gran cantidad de lenguajes y clientes.
<h1>Extras</h1>como material extra dejo el repositorio que arme al llevar un pequeño curso de GQL en este repositorio encontraremos paso a paso cómo se configura un servidor y el uso de GQL además de que ya cuenta con una la integración de Apollo, es importante mencionar que por cada acción que se realiza en el proyecto se cuenta con TAG el cual corresponde a cada paso realizado.
Repositorio de practica realizada
Si te gusto el articulo puedes ver mas en mi espacio de Medium agradeceria mucho el feedbak, de ante mano gracias