Apresentação realizada no Meetup PHPRio em 24/05/2018
(https://www.meetup.com/pt-BR/PHP-Rio/events/250099218/)
Apresentação do GraphQL e caso de uso em uma aplicação com PHP (Laravel).
1. GraphQL: PUTs, onde
foram parar os verbos
HTTP?
“A query language for your API”
Rio de Janeiro - RJ, 24 de maio de 2018
2. 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
3. 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
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
● 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
6. Alguns princípios
1. Pergunte pelo que você precisa e receba exatamente o solicitado
{
hero {
name
}
}
{
"hero": {
"name": "Luke Skywalker"
}
}
7. 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
}
}
8. 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" }
]
}
}
9. 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
}
10. 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
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ã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
14. 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
15. 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
19. 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)
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