GraphQL: PUTs, onde
foram parar os verbos
HTTP?
“A query language for your API”
Rio de Janeiro - RJ, 24 de maio de 2018
Leonardo Gomes
● Programador PHP, Ruby on Rails e JS
● Técnico em Informática (2013) e Bacharel em
Sistemas de Informação (2016) pelo IF Fluminense
● Desenvolvedor (profissionalmente) desde 2015
Quem utiliza o GraphQL?
● Inicialmente começou a ser utilizado pelos apps mobile do Facebook em 2012.
○ Em 2015 tornou-se open source e passou a ser utilizado por diversas
empresas.
● Site oficial: graphql.org
Visão geral
● GraphQL é uma linguagem e não um framework
● As APIs são criadas já com documentação
● Não utiliza-se todos os verbos HTTP
○ Normalmente 200 e array de erros se houver
● Não gerencia autenticação de usuários
Visão geral
● Reduz o stack de inicialização por fazer menos requests
○ Mas não é para fazer tudo em um só request
● É comum o uso de endpoint único para requisições
Alguns princípios
1. Pergunte pelo que você precisa e receba exatamente o solicitado
{
hero {
name
}
}
{
"hero": {
"name": "Luke Skywalker"
}
}
Alguns princípios
1. Pergunte pelo que você precisa e receba exatamente o solicitado
{
hero {
name
height
mass
}
}
{
"hero": {
"name": "Luke Skywalker",
"height": 1.72,
"mass": 77
}
}
Alguns princípios
2. Busque vários recursos em apenas uma requisição
{
hero {
name
friends {
name
}
}
}
{
"hero": {
"name": "Luke Skywalker",
"friends": [
{ "name": "Obi-Wan Kenobi" },
{ "name": "R2-D2" },
{ "name": "Han Solo" },
{ "name": "Leia Organa" }
]
}
}
Alguns princípios
3. Descreva os dados que estão disponíveis através de um sistema de Types
{
hero {
name
friends {
name
homeWorld {
name
climate
}
}
}
}
type Query {
hero: Character
}
type Character {
name: String
friends: [Character]
homeWorld: Planet
}
type Planet {
name: String
climate: String
}
Alguns princípios
4. Evolua sua API sem versionamentos
type Film {
title: String
episode: Int
director: String
}
type Film {
title: String
episode: Int
director: String
}
type Person {
name: String
directed: [Film]
}
@deprecated
+ directedBy: Person
Types padrões
● Int: Um inteiro de 32 bits => 10
● Float: Um valor de ponto flutuante de precisão dupla com sinal => 10.99
● String: Uma sequência em UTF-8 => “Esse é um exemplo”
● Boolean: true ou false.
● ID: Um identificador exclusivo e que não deve ser entendido por humanos.
● * nonNull: Um campo que não pode ser nulo. É diferente de obrigatório.
● * listOf: Uma lista de outros types (um array de dados)
Types adicionais
● Enum
○ Utilizado para lista de status, tipos, etc
● Scalar
○ Utilizado para Date, Datetime, JSON, etc
● Filter
○ Pode ser implementado para receber parâmetros de entrada e filtrar dados a
serem retornados
Conceitos
● Não são utilizados diversos verbos HTTP, normalmente o POST.
● As operações são organizadas em Schema da seguinte forma:
1. Query
Leitura
2. Mutation
Escrita
Bibliotecas para PHP via Composer
● webonyx/graphql-php
○ github.com/webonyx/graphql-php
● rebing/graphql-laravel
○ github.com/rebing/graphql-laravel
Não é exclusivo para PHP e outras linguagens já possuem bibliotecas disponíveis:
C# / .NET Clojure Elixir Erlang Go
Groovy Java JavaScript Python Scala
Ruby
Ferramentas para consumo e testes
● Altair GraphQL Client (Extensão do Chrome)
○ github.com/imolorhe/altair
● GraphQL IDE (Uso avançado)
○ github.com/andev-software/graphql-ide
● Postman (Genérico)
○ getpostman.com
github.com/leogomezzz/laravel-graphql
Não tente modificar os padrões básicos
Conclusão
● GraphQL, quando implementado via HTTP, pode
receber dados via POST (mais comum) ou GET.
● Não implementa os códigos HTTP por não ser
desenvolvido para utilizar e depender exclusivamente
dessa camada.
● Um exemplo é a implementação via Sockets, que
também é possível.
● Embora não implemente todos os códigos HTTP,
códigos 500 e 404 podem ser retornados pelo servidor
(e não pelo GraphQL)
Dicas de leitura
● GraphQL vs. REST
○ dev-blog.apollodata.com/graphql-vs-rest-5d425123e34b
● Easy build API using Laravel and GraphQL
○ medium.com/skyshidigital/easy-build-api-using-laravel-and-graphql-67e2c5c5e
150
● Implementation of graphql with Laravel, JWT and Docker
○ github.com/leogomezzz/laravel-graphql
● GraphQL with WebSockets
○ github.com/apollographql/subscriptions-transport-ws
Dúvidas e agradecimentos
linkedin.com/in/lgomess
github.com/leogomezzz
leonardo.delfica@gmail.com

GraphQL: PUTs, onde foram parar os verbos HTTP?

  • 1.
    GraphQL: PUTs, onde foramparar os verbos HTTP? “A query language for your API” Rio de Janeiro - RJ, 24 de maio de 2018
  • 2.
    Leonardo Gomes ● ProgramadorPHP, Ruby on Rails e JS ● Técnico em Informática (2013) e Bacharel em Sistemas de Informação (2016) pelo IF Fluminense ● Desenvolvedor (profissionalmente) desde 2015
  • 3.
    Quem utiliza oGraphQL? ● Inicialmente começou a ser utilizado pelos apps mobile do Facebook em 2012. ○ Em 2015 tornou-se open source e passou a ser utilizado por diversas empresas. ● Site oficial: graphql.org
  • 4.
    Visão geral ● GraphQLé uma linguagem e não um framework ● As APIs são criadas já com documentação ● Não utiliza-se todos os verbos HTTP ○ Normalmente 200 e array de erros se houver ● Não gerencia autenticação de usuários
  • 5.
    Visão geral ● Reduzo stack de inicialização por fazer menos requests ○ Mas não é para fazer tudo em um só request ● É comum o uso de endpoint único para requisições
  • 6.
    Alguns princípios 1. Perguntepelo que você precisa e receba exatamente o solicitado { hero { name } } { "hero": { "name": "Luke Skywalker" } }
  • 7.
    Alguns princípios 1. Perguntepelo que você precisa e receba exatamente o solicitado { hero { name height mass } } { "hero": { "name": "Luke Skywalker", "height": 1.72, "mass": 77 } }
  • 8.
    Alguns princípios 2. Busquevários recursos em apenas uma requisição { hero { name friends { name } } } { "hero": { "name": "Luke Skywalker", "friends": [ { "name": "Obi-Wan Kenobi" }, { "name": "R2-D2" }, { "name": "Han Solo" }, { "name": "Leia Organa" } ] } }
  • 9.
    Alguns princípios 3. Descrevaos dados que estão disponíveis através de um sistema de Types { hero { name friends { name homeWorld { name climate } } } } type Query { hero: Character } type Character { name: String friends: [Character] homeWorld: Planet } type Planet { name: String climate: String }
  • 10.
    Alguns princípios 4. Evoluasua API sem versionamentos type Film { title: String episode: Int director: String } type Film { title: String episode: Int director: String } type Person { name: String directed: [Film] } @deprecated + directedBy: Person
  • 11.
    Types padrões ● Int:Um inteiro de 32 bits => 10 ● Float: Um valor de ponto flutuante de precisão dupla com sinal => 10.99 ● String: Uma sequência em UTF-8 => “Esse é um exemplo” ● Boolean: true ou false. ● ID: Um identificador exclusivo e que não deve ser entendido por humanos. ● * nonNull: Um campo que não pode ser nulo. É diferente de obrigatório. ● * listOf: Uma lista de outros types (um array de dados)
  • 12.
    Types adicionais ● Enum ○Utilizado para lista de status, tipos, etc ● Scalar ○ Utilizado para Date, Datetime, JSON, etc ● Filter ○ Pode ser implementado para receber parâmetros de entrada e filtrar dados a serem retornados
  • 13.
    Conceitos ● Não sãoutilizados diversos verbos HTTP, normalmente o POST. ● As operações são organizadas em Schema da seguinte forma: 1. Query Leitura 2. Mutation Escrita
  • 14.
    Bibliotecas para PHPvia Composer ● webonyx/graphql-php ○ github.com/webonyx/graphql-php ● rebing/graphql-laravel ○ github.com/rebing/graphql-laravel Não é exclusivo para PHP e outras linguagens já possuem bibliotecas disponíveis: C# / .NET Clojure Elixir Erlang Go Groovy Java JavaScript Python Scala Ruby
  • 15.
    Ferramentas para consumoe testes ● Altair GraphQL Client (Extensão do Chrome) ○ github.com/imolorhe/altair ● GraphQL IDE (Uso avançado) ○ github.com/andev-software/graphql-ide ● Postman (Genérico) ○ getpostman.com
  • 16.
  • 18.
    Não tente modificaros padrões básicos
  • 19.
    Conclusão ● GraphQL, quandoimplementado via HTTP, pode receber dados via POST (mais comum) ou GET. ● Não implementa os códigos HTTP por não ser desenvolvido para utilizar e depender exclusivamente dessa camada. ● Um exemplo é a implementação via Sockets, que também é possível. ● Embora não implemente todos os códigos HTTP, códigos 500 e 404 podem ser retornados pelo servidor (e não pelo GraphQL)
  • 20.
    Dicas de leitura ●GraphQL vs. REST ○ dev-blog.apollodata.com/graphql-vs-rest-5d425123e34b ● Easy build API using Laravel and GraphQL ○ medium.com/skyshidigital/easy-build-api-using-laravel-and-graphql-67e2c5c5e 150 ● Implementation of graphql with Laravel, JWT and Docker ○ github.com/leogomezzz/laravel-graphql ● GraphQL with WebSockets ○ github.com/apollographql/subscriptions-transport-ws
  • 21.