SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
GraphQL na Era das APIs
Daniel Varanda
API Specialist | Solution Architect
daniel.varanda@sensedia.com
http://linkedin.com/in/danielvaranda
Daniel Varanda trabalha há 18 anos em TI. Sua missão
é projetar arquiteturas de soluções focadas em garantir
o sucesso dos projetos de TI e contribuir para o
aumento da maturidade das empresas nas estratégias
de APIs, Microservices e Cloud Solutions.
Agenda
❖ APIs
❖ RESTful
❖ GrapghQL
❖ Dicas e Boas Práticas
❖ Ecossistema GraphQL
❖ Pontos de Atenção
❖ GraphQL em poucas palavras
APIs
APIs are
Skyrocketing
API (em português: Interface de Programação de Aplicação), é um conjunto de
rotinas e padrões estabelecidos por um software para utilização de suas
funcionalidades por aplicativos que não pretendem envolver-se em detalhes
de implementação do software, mas apenas utilizar suas funcionalidades.
Exemplos: RMI, JMS, trocas de arquivo
Web API é uma das formas possíveis para construção de APIs, onde as trocas
de informações entre as aplicações são feitas através da Internet (mais
especificamente através do protocolo de transporte HTTP).
Exemplos: WebService SOAP, RESTful, GraphQL
API
RESTful
RESTfulAPI
Backend
RESTful API
APIGateway
Client App
GET: http://api.sensedia.com/produtos/123
Database
Database
Database
HTTP Status: 200
{
"id": 123,
"nome": "API Management Suite",
"descricao": "Exponha APIs de forma rápida e segura."
}
Request
JSON Payload
RESTful API
Imagine que precisamos construir uma aplicação na qual sejam
obtidos todos os nossos amigos do Facebook que curtiram a
página do Sérgio Moro
RESTful API
Consulta em RESTful
1. Um GET em:
GET: me/friends
2. Agora para cada um dos “N” amigos retornados, temos que fazer um GET em:
GET: me/friends/{friend_id}/pages?page_name=Sérgio Moro
RESTful API
Bem que o Facebook poderia ter o seguinte recurso:
GET: me/friendsLikedPage?page_name=Sérgio Moro
Quando as APIs são de uso interno, até podemos fazer um
workaround para resolver determinados problemas
Mas isso não é escalável!
● Demanda implementações específicas (ou caso a caso)
● Mais tempo de desenvolvimento
● Novas recursos a serem mantidos
● E muito mais...
RESTful API
Em uma estratégia de Open APIs, é impossível prever
todas necessidades que os desenvolvedores de
aplicativos terão sobre nossas APIs
RESTful API
GraphQL
GraphQL API
GraphQL é uma Declarative
Query Language
Uma especificação para
interações client/server
Independente de data store
Independente de plataforma
Desenvolvido em 2012 pela equipe do
Facebook e Open source desde Julho
de 2015
Utilizado principalmente para
melhorar a performance e experiência
de uso de aplicações Mobile
Facebook
Quem está utilizando GraphQL?
Github Pinterest
Coursera Shopify Natura
Intruit
E muitos outros...
Os aplicativos móveis do Facebook utilizam a API GraphQL desde 2012
Desde que se tornou Open Source, em 2015, muitas outras equipes e
de todos os tamanhos também vêm utilizando GraphQL
GraphQL API
Descreva seu dado
type Project {
name: String
tagline: String
contributors: [User]
}
Diga o que você quer
{
project(name: "GraphQL") {
tagline
}
}
Obtenha o resultado
{
"project": {
"tagline": "A query language for APIs"
}
}
Backend
GraphQL API
GraphQL-Server
APIGateway
Client App
POST: http://api.sensedia.com/graphQL
{
produto(id: 123) {
id
nome
}
}
Database
Database
Database
HTTP Status: 200
{
"data": {
"produto": {
"id": 123,
"name": "API Management Suite"
}
}
}
GraphQL Query
JSON Payload
Validation
Resolver
Producing the result
GraphQL API
Queries
Análogo a operação GET do Restful
GraphQL API
{
"data": {
"person": {
"id": "cGVvcGxlOjE=",
"name": "Luke Skywalker",
"gender": "male",
"height": 172,
"mass": 77,
"birthYear": "19BBY",
"skinColor": "fair",
"hairColor": "blond",
"eyeColor": "blue"
}
}
}
Response - JSON e dados solicitados
{
person(id: "cGVvcGxlOjE=") {
id
name
gender
height
mass
birthYear
skinColor
hairColor
eyeColor
}
}
Request
Declarative query language
O client declara os dados que precisa e a resposta é um espelho da entrada
GraphQL API
{
"data": {
"starship": {
"id": "c3RhcnNoaXBzOjI=",
"length": 150
},
"film": {
"id": "ZmlsbXM6MQ==",
"title": "A New Hope"
}
}
}
Response - JSON e dados solicitados
{
starship(id: "c3RhcnNoaXBzOjI=") {
id
length
}
film(id: "ZmlsbXM6MQ==") {
id
title
}
}
Request
Permite múltiplas queries na mesma requisição
GraphQL API
{
"data": {
"starship": {
"id": " 1",
"length": 150,
"model": "CR90 corvette",
"manufacturers": [
"Corellian Engineering Corporation"
]
}
}
}
Response - JSON e dados solicitados
{
starship(id: " 1") {
id
length
}
starship(id: " 1") {
model
manufacturers
}
}
Request
Merge da mesma instância de objeto
GraphQL API
{
"data": {
"starship1": {
"id": "1",
"length": 150
},
"starship2": {
"id": "2",
"length": 1600
}
}
}
Response - JSON e dados solicitados
{
starship1: starship(id: " 1") {
id
length
}
starship2: starship(id: " 2") {
id
length
}
}
Request
Alias: evitando conflitos entre instâncias diferentes do mesmo objeto
GraphQL API
{
"data": {
"film": {
"id": "ZmlsbXM6MQ==",
"title": "A New Hope",
"speciesConnection ": {
"edges": [
{
"node": {
"id": "c3BlY2llczox",
"name": "Human"
}
},
...
Response - JSON e dados solicitados
{
film(id: "ZmlsbXM6MQ==") {
id
title
speciesConnection {
edges {
node {
id
name
}
}
}
}
}
Request
Objetos aninhados
GraphQL API
{
"data": {
"film": {
"id": "ZmlsbXM6MQ==",
"speciesConnection ": {
"edges": [
{
"node": {
"id": "c3BlY2llczox",
" filmConnection ": {
"edges": [
{
"node": {
"id": "ZmlsbXM6MQ=="
}
},
...
Response - JSON e dados solicitados
{
film(id: "ZmlsbXM6MQ==") {
id
speciesConnection {
edges {
node {
id
filmConnection {
edges {
node {
id
}
}
}
}
}
}
}
}
Request
Permite inclusive referências cíclicas
GraphQL API
{
"data": {
"person": {
"id": "cGVvcGxlOjE=",
"name": "Luke Skywalker",
"gender": "male",
"height": 172,
}
}
}
Response - JSON e dados solicitados
{
person(id: "cGVvcGxlOjE=") {
id
name
gender
height( unit: METER )
}
}
Request
Argumentos
Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
GraphQL API
{
"data": {
"film": {
"id": "ZmlsbXM6MQ==",
"created": " 2014-12-10"
}
}
}
Response - JSON e dados solicitados
{
film(id: "ZmlsbXM6MQ==") {
id
created( format: "YYYY-MM-DD" )
}
}
Request
Argumentos
Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
GraphQL API
{
"data": {
"allFilms": {
"edges": [
{
"node": {
"id": "ZmlsbXM6Ng==",
"speciesConnection": {
"species": [
{
"id": "c3BlY2llczox"
}
],
"totalCount": 40
}
}
...
Response - JSON e dados solicitados
{
allFilms( last:1,
orderBy: {field: id ,
direction: DESC} ) {
edges {
node {
id
speciesConnection( first: 1) {
species {
id
}
totalCount
}
}
}
}
}
Request
Paginação
Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
GraphQL API
{
"data": {
"allFilms": {
"edges": [
{
"node": {
"starshipConnection": {
"edges": [
{
"node": {
"name": "CR90 corvette"
}
},
...
Response - JSON e dados solicitados
query($registros: Int=1, $expand: Boolean=true) {
allFilms(first: $registros) {
edges {
node {
starshipConnection @include(if: $expand) {
edges {
node {
name
}
}
}
}
}
}
}
{
"rgistros": 1,
"expand": true
}
Request
Variáveis e Directivas
GraphQL API
{
"data": {
"person": {
"id": "cGVvcGxlOjE=",
"name": "Luke Skywalker",
"gender": "male",
"height": 172,
"mass": 77
}
}
}
Response - JSON e dados solicitados
{
person(id: "cGVvcGxlOjE=") {
id
...Atributos
}
}
fragment Atributos on Person {
name
gender
height
mass
}
Request
Fragmentos
GraphQL API
{
"data": {
"search": [
{
"__typename": "Human" ,
"name": "H an Solo"
},
{
"__typename": "Human" ,
"name": "Leia Org ana"
},
{
"__typename": "Starship" ,
"name": "TIE Adv anced x1"
}
]
}
}
Response - JSON e dados solicitados
{
search(text: " an") {
__typename
... on Human {
name
}
... on Droid {
name
}
... on Starship {
name
}
}
}
Request
Uniões e Polimorfismo
Situações em que você não sabe o tipo de retorno, você precisará de alguma maneira para determinar como
lidar com esses dados no cliente
GraphQL API
Mutações
Análogo as operações POST / PUT / DELETE do Restful
Enquanto que as Queries são executados em paralelo, as mutação são executados
em série, uma após a outra. Isto significa que, se enviarmos duas mutações de
“IncrementoDeCredito”, o primeiro irá terminar antes que o segundo inicie
GraphQL API
{
"data": {
"CreatePerson": {
"id": "123",
"name": "Daniel Varanda"
}
}
}
Response - JSON e dados solicitados
mutation {
CreatePerson(name: "Daniel Varanda") {
id
name
}
}
Request
Mutações
Caso a operação de mutação retorne um objeto, você pode solicitar atributos específicos e objetos aninhados
GraphQL API
{
"data": {
"DeletePerson": {
"deleted": true
}
}
}
Response - JSON e dados solicitados
mutation {
DeletePerson(id: "123")
}
Request
Mutações
GraphQL API
{
"data": {
"UpdatePerson": null
},
"errors": [
{
"message": "Person not found",
"path": [
"UpdatePerson"
],
}
]
}
Response - JSON e dados solicitados
mutation {
UpdatePerson(id: "123")
}
Request
Mutações e Validações
Dicas e Boas Práticas
Dicas e Boas Práticas
Use primeiro para APIs internas, ou para uso externo restrito
Use para melhorar a experiências/performance de APPs que consomem
dados de backends
Tenha cuidado em expor para o mundo!
Não permita queries arbitrárias (sem controle) de um client
desconhecido
1
2
3
Ecossistema GraphQL
GraphQL Clients
● JavaScript - Relay, Apollo Client, Lokka
● Swift / iOS - Apollo iOS
● Java / Android - Apollo Android
● C# / .NET - graphql-net-client
Ecossistema GraphQL
Server Libraries
● JavaScript - GraphQL.js, express-graphql, graphql-server
● Ruby - graphql-ruby
● Python - Graphene
● Scala - Sangria
● Java - graphql-java
● Clojure - alumbra, graphql-clj, lacinia
● Go - graphql-go, graphql-relay-go, neelance/graphql-go
● PHP - graphql-php, graphql-relay-php
● C# / .NET - graphql-dotnet, graphql-net
● Elixir - absinthe, graphql-elixir
Ecossistema GraphQL
IDE for Documentation and exploring GraphQL
● GitHub: https://github.com/graphql/graphiql
● Exemplo: http://graphql.org/swapi-graphql/
Ecossistema GraphQL
Pontos de Atenção
Pontos de Atenção
As operações não são claras como em
REST - GET/POST/PUT/DELETE...
Todo retorno é HTTP 200 OK
Mais poder para os developers de
APPs
Não facilita o lado de prover as APIs
Não resolve sozinho os problemas (esforço) de design
Efeito colateral de utilizar mais dados de
entrada na chamada e uso do servidor
(processamento)
Dificuldade em fazer troubleshooting de problemas e
dar suporte aos desenvolvedores de APPs
Pontos de Atenção
Trace GraphQL
Pontos de Atenção
Trace RESTful
GraphQL em poucas palavras
❖ Único endpoint
❖ A query language for your API
❖ Pedir o que você precisa e obter exatamente isso (nada mais, nada menos)
❖ Obtenha muitos recursos em um único pedido
❖ Descrever o que é possível com um sistema de tipagem
❖ Mova-se mais rápido com poderosas ferramentas de desenvolvedor
❖ Evolua sua API sem necessidade de versionamento
❖ Utilize o suas próprias bases de dados e código
GraphQL em poucas palavras
Obrigado!
Daniel Varanda
API Specialist | Solution Architect
daniel.varanda@sensedia.com
http://linkedin.com/in/danielvaranda

Mais conteúdo relacionado

Semelhante a GraphQL na Era das APIs

Introdução ao GraphQL - Uma nova forma de criar APIs
Introdução ao GraphQL - Uma nova forma de criar APIsIntrodução ao GraphQL - Uma nova forma de criar APIs
Introdução ao GraphQL - Uma nova forma de criar APIsFernando Henriques
 
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)Fernando Henriques
 
GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017Marcos Brizeno
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfBrunoAlbuquerque864673
 
Criando um gateway de microserviços com GraphQL - Felipe Lopes
Criando um gateway de microserviços com GraphQL - Felipe LopesCriando um gateway de microserviços com GraphQL - Felipe Lopes
Criando um gateway de microserviços com GraphQL - Felipe LopesFelipe Lopes
 
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiInterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiiMasters
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8Leonardo Neuwald
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8Cristian R. Silva
 
Os 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulOs 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulKleber Bacili
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouqueceriMasters
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteJohann Vivot
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidJosé Alexandre Macedo
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfBrunoAlbuquerque864673
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 
PHPTalks 2019: GraphQL + Laravel
PHPTalks 2019: GraphQL + LaravelPHPTalks 2019: GraphQL + Laravel
PHPTalks 2019: GraphQL + LaravelJansen Felipe
 

Semelhante a GraphQL na Era das APIs (20)

Introdução ao GraphQL - Uma nova forma de criar APIs
Introdução ao GraphQL - Uma nova forma de criar APIsIntrodução ao GraphQL - Uma nova forma de criar APIs
Introdução ao GraphQL - Uma nova forma de criar APIs
 
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)
Introdução ao GraphQL - Uma nova forma de criar APIs (Ruby)
 
Acessando banco de dados remoto com android
Acessando banco de dados remoto com android Acessando banco de dados remoto com android
Acessando banco de dados remoto com android
 
GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdf
 
Criando um gateway de microserviços com GraphQL - Felipe Lopes
Criando um gateway de microserviços com GraphQL - Felipe LopesCriando um gateway de microserviços com GraphQL - Felipe Lopes
Criando um gateway de microserviços com GraphQL - Felipe Lopes
 
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiInterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8
 
Os 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulOs 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTful
 
Android + firebase
Android + firebaseAndroid + firebase
Android + firebase
 
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecerInterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonte
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma Android
 
Introdução ao GraphQL
Introdução ao GraphQLIntrodução ao GraphQL
Introdução ao GraphQL
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdf
 
Api v3
Api v3Api v3
Api v3
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Grails
GrailsGrails
Grails
 
PHPTalks 2019: GraphQL + Laravel
PHPTalks 2019: GraphQL + LaravelPHPTalks 2019: GraphQL + Laravel
PHPTalks 2019: GraphQL + Laravel
 

GraphQL na Era das APIs

  • 1. GraphQL na Era das APIs Daniel Varanda API Specialist | Solution Architect daniel.varanda@sensedia.com http://linkedin.com/in/danielvaranda Daniel Varanda trabalha há 18 anos em TI. Sua missão é projetar arquiteturas de soluções focadas em garantir o sucesso dos projetos de TI e contribuir para o aumento da maturidade das empresas nas estratégias de APIs, Microservices e Cloud Solutions.
  • 2.
  • 3. Agenda ❖ APIs ❖ RESTful ❖ GrapghQL ❖ Dicas e Boas Práticas ❖ Ecossistema GraphQL ❖ Pontos de Atenção ❖ GraphQL em poucas palavras
  • 6. API (em português: Interface de Programação de Aplicação), é um conjunto de rotinas e padrões estabelecidos por um software para utilização de suas funcionalidades por aplicativos que não pretendem envolver-se em detalhes de implementação do software, mas apenas utilizar suas funcionalidades. Exemplos: RMI, JMS, trocas de arquivo Web API é uma das formas possíveis para construção de APIs, onde as trocas de informações entre as aplicações são feitas através da Internet (mais especificamente através do protocolo de transporte HTTP). Exemplos: WebService SOAP, RESTful, GraphQL API
  • 8. RESTfulAPI Backend RESTful API APIGateway Client App GET: http://api.sensedia.com/produtos/123 Database Database Database HTTP Status: 200 { "id": 123, "nome": "API Management Suite", "descricao": "Exponha APIs de forma rápida e segura." } Request JSON Payload
  • 9. RESTful API Imagine que precisamos construir uma aplicação na qual sejam obtidos todos os nossos amigos do Facebook que curtiram a página do Sérgio Moro
  • 10. RESTful API Consulta em RESTful 1. Um GET em: GET: me/friends 2. Agora para cada um dos “N” amigos retornados, temos que fazer um GET em: GET: me/friends/{friend_id}/pages?page_name=Sérgio Moro
  • 11. RESTful API Bem que o Facebook poderia ter o seguinte recurso: GET: me/friendsLikedPage?page_name=Sérgio Moro
  • 12. Quando as APIs são de uso interno, até podemos fazer um workaround para resolver determinados problemas Mas isso não é escalável! ● Demanda implementações específicas (ou caso a caso) ● Mais tempo de desenvolvimento ● Novas recursos a serem mantidos ● E muito mais... RESTful API
  • 13. Em uma estratégia de Open APIs, é impossível prever todas necessidades que os desenvolvedores de aplicativos terão sobre nossas APIs RESTful API
  • 15. GraphQL API GraphQL é uma Declarative Query Language Uma especificação para interações client/server Independente de data store Independente de plataforma Desenvolvido em 2012 pela equipe do Facebook e Open source desde Julho de 2015 Utilizado principalmente para melhorar a performance e experiência de uso de aplicações Mobile
  • 16. Facebook Quem está utilizando GraphQL? Github Pinterest Coursera Shopify Natura Intruit E muitos outros... Os aplicativos móveis do Facebook utilizam a API GraphQL desde 2012 Desde que se tornou Open Source, em 2015, muitas outras equipes e de todos os tamanhos também vêm utilizando GraphQL
  • 17. GraphQL API Descreva seu dado type Project { name: String tagline: String contributors: [User] } Diga o que você quer { project(name: "GraphQL") { tagline } } Obtenha o resultado { "project": { "tagline": "A query language for APIs" } }
  • 18. Backend GraphQL API GraphQL-Server APIGateway Client App POST: http://api.sensedia.com/graphQL { produto(id: 123) { id nome } } Database Database Database HTTP Status: 200 { "data": { "produto": { "id": 123, "name": "API Management Suite" } } } GraphQL Query JSON Payload Validation Resolver Producing the result
  • 19. GraphQL API Queries Análogo a operação GET do Restful
  • 20. GraphQL API { "data": { "person": { "id": "cGVvcGxlOjE=", "name": "Luke Skywalker", "gender": "male", "height": 172, "mass": 77, "birthYear": "19BBY", "skinColor": "fair", "hairColor": "blond", "eyeColor": "blue" } } } Response - JSON e dados solicitados { person(id: "cGVvcGxlOjE=") { id name gender height mass birthYear skinColor hairColor eyeColor } } Request Declarative query language O client declara os dados que precisa e a resposta é um espelho da entrada
  • 21. GraphQL API { "data": { "starship": { "id": "c3RhcnNoaXBzOjI=", "length": 150 }, "film": { "id": "ZmlsbXM6MQ==", "title": "A New Hope" } } } Response - JSON e dados solicitados { starship(id: "c3RhcnNoaXBzOjI=") { id length } film(id: "ZmlsbXM6MQ==") { id title } } Request Permite múltiplas queries na mesma requisição
  • 22. GraphQL API { "data": { "starship": { "id": " 1", "length": 150, "model": "CR90 corvette", "manufacturers": [ "Corellian Engineering Corporation" ] } } } Response - JSON e dados solicitados { starship(id: " 1") { id length } starship(id: " 1") { model manufacturers } } Request Merge da mesma instância de objeto
  • 23. GraphQL API { "data": { "starship1": { "id": "1", "length": 150 }, "starship2": { "id": "2", "length": 1600 } } } Response - JSON e dados solicitados { starship1: starship(id: " 1") { id length } starship2: starship(id: " 2") { id length } } Request Alias: evitando conflitos entre instâncias diferentes do mesmo objeto
  • 24. GraphQL API { "data": { "film": { "id": "ZmlsbXM6MQ==", "title": "A New Hope", "speciesConnection ": { "edges": [ { "node": { "id": "c3BlY2llczox", "name": "Human" } }, ... Response - JSON e dados solicitados { film(id: "ZmlsbXM6MQ==") { id title speciesConnection { edges { node { id name } } } } } Request Objetos aninhados
  • 25. GraphQL API { "data": { "film": { "id": "ZmlsbXM6MQ==", "speciesConnection ": { "edges": [ { "node": { "id": "c3BlY2llczox", " filmConnection ": { "edges": [ { "node": { "id": "ZmlsbXM6MQ==" } }, ... Response - JSON e dados solicitados { film(id: "ZmlsbXM6MQ==") { id speciesConnection { edges { node { id filmConnection { edges { node { id } } } } } } } } Request Permite inclusive referências cíclicas
  • 26. GraphQL API { "data": { "person": { "id": "cGVvcGxlOjE=", "name": "Luke Skywalker", "gender": "male", "height": 172, } } } Response - JSON e dados solicitados { person(id: "cGVvcGxlOjE=") { id name gender height( unit: METER ) } } Request Argumentos Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
  • 27. GraphQL API { "data": { "film": { "id": "ZmlsbXM6MQ==", "created": " 2014-12-10" } } } Response - JSON e dados solicitados { film(id: "ZmlsbXM6MQ==") { id created( format: "YYYY-MM-DD" ) } } Request Argumentos Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
  • 28. GraphQL API { "data": { "allFilms": { "edges": [ { "node": { "id": "ZmlsbXM6Ng==", "speciesConnection": { "species": [ { "id": "c3BlY2llczox" } ], "totalCount": 40 } } ... Response - JSON e dados solicitados { allFilms( last:1, orderBy: {field: id , direction: DESC} ) { edges { node { id speciesConnection( first: 1) { species { id } totalCount } } } } } Request Paginação Cada atributo e objeto aninhado pode ter seu próprio conjunto de argumentos
  • 29. GraphQL API { "data": { "allFilms": { "edges": [ { "node": { "starshipConnection": { "edges": [ { "node": { "name": "CR90 corvette" } }, ... Response - JSON e dados solicitados query($registros: Int=1, $expand: Boolean=true) { allFilms(first: $registros) { edges { node { starshipConnection @include(if: $expand) { edges { node { name } } } } } } } { "rgistros": 1, "expand": true } Request Variáveis e Directivas
  • 30. GraphQL API { "data": { "person": { "id": "cGVvcGxlOjE=", "name": "Luke Skywalker", "gender": "male", "height": 172, "mass": 77 } } } Response - JSON e dados solicitados { person(id: "cGVvcGxlOjE=") { id ...Atributos } } fragment Atributos on Person { name gender height mass } Request Fragmentos
  • 31. GraphQL API { "data": { "search": [ { "__typename": "Human" , "name": "H an Solo" }, { "__typename": "Human" , "name": "Leia Org ana" }, { "__typename": "Starship" , "name": "TIE Adv anced x1" } ] } } Response - JSON e dados solicitados { search(text: " an") { __typename ... on Human { name } ... on Droid { name } ... on Starship { name } } } Request Uniões e Polimorfismo Situações em que você não sabe o tipo de retorno, você precisará de alguma maneira para determinar como lidar com esses dados no cliente
  • 32. GraphQL API Mutações Análogo as operações POST / PUT / DELETE do Restful Enquanto que as Queries são executados em paralelo, as mutação são executados em série, uma após a outra. Isto significa que, se enviarmos duas mutações de “IncrementoDeCredito”, o primeiro irá terminar antes que o segundo inicie
  • 33. GraphQL API { "data": { "CreatePerson": { "id": "123", "name": "Daniel Varanda" } } } Response - JSON e dados solicitados mutation { CreatePerson(name: "Daniel Varanda") { id name } } Request Mutações Caso a operação de mutação retorne um objeto, você pode solicitar atributos específicos e objetos aninhados
  • 34. GraphQL API { "data": { "DeletePerson": { "deleted": true } } } Response - JSON e dados solicitados mutation { DeletePerson(id: "123") } Request Mutações
  • 35. GraphQL API { "data": { "UpdatePerson": null }, "errors": [ { "message": "Person not found", "path": [ "UpdatePerson" ], } ] } Response - JSON e dados solicitados mutation { UpdatePerson(id: "123") } Request Mutações e Validações
  • 36. Dicas e Boas Práticas
  • 37. Dicas e Boas Práticas Use primeiro para APIs internas, ou para uso externo restrito Use para melhorar a experiências/performance de APPs que consomem dados de backends Tenha cuidado em expor para o mundo! Não permita queries arbitrárias (sem controle) de um client desconhecido 1 2 3
  • 39. GraphQL Clients ● JavaScript - Relay, Apollo Client, Lokka ● Swift / iOS - Apollo iOS ● Java / Android - Apollo Android ● C# / .NET - graphql-net-client Ecossistema GraphQL
  • 40. Server Libraries ● JavaScript - GraphQL.js, express-graphql, graphql-server ● Ruby - graphql-ruby ● Python - Graphene ● Scala - Sangria ● Java - graphql-java ● Clojure - alumbra, graphql-clj, lacinia ● Go - graphql-go, graphql-relay-go, neelance/graphql-go ● PHP - graphql-php, graphql-relay-php ● C# / .NET - graphql-dotnet, graphql-net ● Elixir - absinthe, graphql-elixir Ecossistema GraphQL
  • 41. IDE for Documentation and exploring GraphQL ● GitHub: https://github.com/graphql/graphiql ● Exemplo: http://graphql.org/swapi-graphql/ Ecossistema GraphQL
  • 43. Pontos de Atenção As operações não são claras como em REST - GET/POST/PUT/DELETE... Todo retorno é HTTP 200 OK Mais poder para os developers de APPs Não facilita o lado de prover as APIs Não resolve sozinho os problemas (esforço) de design Efeito colateral de utilizar mais dados de entrada na chamada e uso do servidor (processamento) Dificuldade em fazer troubleshooting de problemas e dar suporte aos desenvolvedores de APPs
  • 46. GraphQL em poucas palavras
  • 47. ❖ Único endpoint ❖ A query language for your API ❖ Pedir o que você precisa e obter exatamente isso (nada mais, nada menos) ❖ Obtenha muitos recursos em um único pedido ❖ Descrever o que é possível com um sistema de tipagem ❖ Mova-se mais rápido com poderosas ferramentas de desenvolvedor ❖ Evolua sua API sem necessidade de versionamento ❖ Utilize o suas próprias bases de dados e código GraphQL em poucas palavras
  • 48. Obrigado! Daniel Varanda API Specialist | Solution Architect daniel.varanda@sensedia.com http://linkedin.com/in/danielvaranda