#VemProReact
GraphQL
O que é?
#VemProReact
GraphQL
Referências para estudos:
#VemProReact
Queries
Como funcionam?
#VemProReact
Queries
(Na teoria)
#VemProReact
Queries
Considerando o service abaixo:
Query.usuario(
filter: USR_usuario_get_by_id_filter
): USR_usuario_typetype USR_usuario_type {
id: String!
nome: String
email: String
}type USR_usuario_get_by_id_filter {
id: String!
}E os types abaixo:
* A "!" indica que o campo id é obrigatório e deve ser informado no filtro
* A "!" indica que o campo id é obrigatório no banco de dados (NOT NULL)
#VemProReact
Queries
Podemos fazer esta query:
{
usuario {
nome_do_usuario: nome
}
}query {
usuario(filter: { id: "KAZUMI" }) {
nome_do_usuario: nome
}
}OU
E obter este resultado em JSON:
{
"data": {
"usuario": {
"nome_do_usuario": "Kazumi Futatsugi (Softplan - SC)"
}
}
}#VemProReact
Mutations
Como funcionam?
#VemProReact
Mutations
(Na teoria)
#VemProReact
Mutations
Considerando o service abaixo:
Mutation.update_usuario(
input: USR_usuario_update_input_type_input!
): USR_usuario_type
type USR_usuario_update_input_type_input {
id: String!
nome: String!
documento: String!
genero: USR_e_genero_type!
}** A "!" indica que os campos id, nome, documento e genero são obrigatório e deve ser informado no input
* A "!" indica que o input é obrigatório e deve ser informado na mutation
Podemos fazer esta mutation:
mutation {
update_usuario(
input: {
id: "KAZUMI"
nome: "Kazumi Futatsugi (Softplan - SC)"
documento: "91784186660"
genero: FEMININO
}
) {
id
nome
documento
}
}
#VemProReact
Mutations
E obter este resultado em JSON:
{
"data": {
"update_usuario": {
"id": "KAZUMI",
"nome": "Kazumi Futatsugi (Softplan - SC)",
"documento": "91784186660"
}
}
}#VemProReact
Mutations
#VemProReact
Apollo Master SAJ6
O que é?
#VemProReact
Apollo Master SAJ6
#VemProReact
JWT
Bearer SEVBREVS.UEFZTE9BRA==.U0lHTkFUVVJFExemplo:
#VemProReact
Authorization
{
"Authorization": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ3..."
}Para conseguir um token válido:
copy(localStorage.token)Será simplesmente "Bearer " seguido de um token JWT:
#VemProReact
lotacao
{
"lotacao": 357
}Para conseguir um id de lotação válido:
copy(localStorage.lotacao)Será simplesmente o id da lotação do usuário:
#VemProReact
HTTP HEADERS
Será simplesmente um objeto contendo o Authorization e a lotacao do usuário:
{
"Authorization": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ3...",
"lotacao": 357
}Simples assim!
Como funcionam?
#VemProReact
Queries / Mutations
(Na prática)
#VemProReact
Playground
http://tj-master-pg.saj6.softplan.com.br/apollo
#VemProReact
Playground
O melhor amigo do Playground é o:
Como funciona?
#VemProReact
GraphQL
(No React)
#VemProReact
Apollo Client
Referências para estudos:
#VemProReact
Apollo Client
Referências para estudos:
https://www.apollographql.com/docs/react/v2.5/essentials/get-started/
Como utilizar?
#VemProReact
Apollo Client
Instalar os pacotes necessários:
yarn add apollo-boost apollo-link-context react-apollo graphqlDefinir um contexto de execução das requisições:
import { setContext } from 'apollo-link-context';
const authLink = setContext((_, { headers }) => ({
headers: {
...headers,
lotacao: 357,
authorization: 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ3...'
}
}));#VemProReact
Apollo Client
Associar um endpoint:
import { createHttpLink } from 'apollo-link-http';
const httpLink = createHttpLink({
uri: 'http://master.saj6.softplan.com.br/apollo'
});Definir um objeto de cache:
import { InMemoryCache } from 'apollo-cache-inmemory';
const cache = new InMemoryCache({
addTypename: false
});#VemProReact
Apollo Client
Criar e exportar o client com as configurações anteriores:
import { ApolloClient } from 'apollo-client';
const apolloClient = new ApolloClient({
link: authLink.concat(httpLink),
cache
});
export default apolloClient;#VemProReact
Apollo Client
import { setContext } from 'apollo-link-context';
import { createHttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloClient } from 'apollo-client';
const authLink = setContext((_, { headers }) => ({
headers: {
...headers,
lotacao: 357,
authorization: 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6IC...'
}
}));
const httpLink = createHttpLink({
uri: 'http://master.saj6.softplan.com.br/apollo'
});
const cache = new InMemoryCache({
addTypename: false
});
const apolloClient = new ApolloClient({
link: authLink.concat(httpLink),
cache
});
export default apolloClient;#VemProReact
Apollo Client
import { ApolloProvider } from 'react-apollo';
import apolloClient from './apolloClient';
ReactDOM.render(
<ApolloProvider client={apolloClient}>
<App />
</ApolloProvider>,
document.getElementById('root')
);Adicionar o ApolloProvider informando o client criado como prop:
#VemProReact
Dúvidas?
#VemProReact
Atividade!
Dashboard Usuário
#VemProReact
Atividade!
#VemProReact
Atividade!
#VemProReact
Obrigado!