GraphQL é uma linguagem de consulta de dados desenvolvida e usado pelo Facebook para realizar requisições e entregar informações para aplicações web e mobile desde 2012. GraphQL facilita o processo de entregar ao client apenas o que foi requisitado pelo mesmo e na ordem em que foi requisitado.
Podemos solicitar apenas os dados name, age, city e as linguagens que o usuário possui conhecimento(knowledge.language) ao fazer a seguinte requisição para o servidor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
query {
user(name:"Joao") {
name
age
city
knowledge {
language
}
}
}
// Retornando:
{
"data": {
"user": {
"name": "Joao",
"age": 22,
"city": "Campina Grande",
"knowledge": [
{
"language": "Javascript"
},
{
"language": "Java"
},
{
"language": "Python"
}
]
}
}
}
Se eu também quiser que retorne os frameworks basta adicionar frameworks dentro do bloco de knowledge, ficando assim:
Criaremos um arquivo chamado schema.js com o seguinte código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const graphql = require('graphql')
const users = require('./user.json')
let knowledgeType = new graphql.GraphQLObjectType({
name:'Knowledge',
fields: {
language: { type: graphql.GraphQLString },
frameworks: { type: new graphql.GraphQLList(graphql.GraphQLString ) }
}
})
let userType = new graphql.GraphQLObjectType({
name: 'User',
fields: {
id: { type: new graphql.GraphQLNonNull(graphql.GraphQLInt) },
name: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) },
full_name: { type: graphql.GraphQLString },
age: { type: graphql.GraphQLInt },
city: { type: graphql.GraphQLString },
tag: { type: graphql.GraphQLString },
url: { type: graphql.GraphQLString },
knowledge: { type: new graphql.GraphQLList(knowledgeType) }
}
})
let schema = new graphql.GraphQLSchema({
query: new graphql.GraphQLObjectType({
name: 'Query',
fields: {
user: {
type: userType,
args: {
id:{
type: graphql.GraphQLInt
}
},
resolve: function (_ , args) {
let response = users.find(function (user){
return (user.id === args.id)
})
return response
}
}
}
})
})
module.exports = schema
No código acima criamos dois GraphQLObjectType chamados de userType e knowledgeType, eles funcionam como ‘models’ para o schema. Precisamos criar um tipo especifico para ‘knowledge’ para que possamos solicitar apenas parte dos dados desse campo, como no exemplo anterior.
O schema é um objeto do tipo GraphQLSchema que recebe um GraphQLObjectType com as propriedades name e fields. Em fields ficam os métodos que serão usados na query. No nosso caso, temos user que vai usar o userType passado na propriedade type como tipo de dado a ser manipulado e em args passamos os argumentos que este método deve receber para realizar a operação como propriedades que recebem de qual tipo esse argumento será, no caso acima temos o argumento id que será do tipo int. A propriedade resolve de user recebe uma função, está função será responsável por buscar e retornar o usuário que possui a id passada como argumento.
Agora, criaremos o arquivo index.js onde iniciaremos o servidor e determinaremos a rota que usará o schema que acabamos de criar. O código de index.js será este:
Aqui iniciamos o servidor com express na porta 3000 e criamos uma rota para /user passando a função graphqlHTTP({schema:users, pretty: true}) para ser chamado sempre que for realizada uma requisição nessa rota. Foi passado um objeto com a propriedade schema com o schema que criamos em schema.js como valor dessa propriedade. Essa função se responsabiliza por verificar a requisição e executar a resolve referente a propriedade passada na requisição.
A Propriedade query em schema recebe em fields os métodos que serão chamados em requisições GET, como no nosso caso user que ira retornar o usuário através da função declarada na propriedade de user chamada resolve.
Mas e pra retornar a lista com todos os usuários? Simples, basta adicionarmos o código abaixo como outra propriedade de fields:
1
2
3
4
5
6
users: {
type: new graphql.GraphQLList(userType),
resolve: function (_ , args) {
return users
}
}
Assim passamos a ter dois métodos de query no schema, user que retorna o usuário com a id passada como argumento e users que retorna a lista com todos os usuários. Experimente:
Ficou faltando falar de criar, atualizar e deletar dados, certo? não se preocupe, farei outro post falando sobre isso porque este já ficou bem extenso. Até mais!