Definição de Schema
Raiz do Schema
schema { query: Query mutation: Mutation }
Tipo de Objeto
type User { id: ID! name: String! email: String }
Queries
Query Básica
query { user(id: "1") { name email } }
Query Nomeada com Alias
query GetUsers { admin: user(role: ADMIN) { name } guest: user(role: GUEST) { name } }
Mutations
Mutation Básica
mutation { createUser(input: { name: "Alice" }) { id name } }
Tipos Input
input CreateUserInput { name: String! email: String }
Subscriptions
Subscription Básica
subscription { messageAdded(channel: "general") { text sender { name } } }
Visão Geral
subscriptionDados em tempo real via WebSocket
Server pushServidor envia atualizações para o cliente
Single fieldApenas um campo raiz por subscription
Tipos
Tipos Escalares
IntInteiro de 32 bits com sinal
FloatPonto flutuante de dupla precisão
StringSequência de caracteres UTF-8
Booleantrue ou false
IDIdentificador único (serializado como String)
Modificadores de Tipo
StringString nullable
String!String não-null
[String]Lista nullable de strings nullable
[String!]!Lista não-null de strings não-null
Enum e Union
enum Role { ADMIN USER GUEST } union SearchResult = User | Post interface Node { id: ID! }
Argumentos e Variáveis
Variáveis
query GetUser($id: ID!) { user(id: $id) { name } } # Variables: { "id": "123" }
Valores Padrão
query GetUsers($limit: Int = 10) { users(limit: $limit) { name } }
Fragments
Fragment Nomeado
fragment UserFields on User { id name email }
Usando Fragments
query { user(id: "1") { ...UserFields } admin: user(id: "2") { ...UserFields } }
Fragment Inline
query { search(text: "a") { ... on User { name } ... on Post { title } } }
Diretivas
Diretivas Embutidas
@include(if: Boolean!)Incluir campo somente quando condição for verdadeira
@skip(if: Boolean!)Pular campo quando condição for verdadeira
@deprecated(reason: String)Marcar campo como depreciado
Exemplo de Uso
query GetUser($withEmail: Boolean!) { user(id: "1") { name email @include(if: $withEmail) } }
Introspecção
Introspecção de Tipo
query { __type(name: "User") { name fields { name type { name } } } }
Introspecção de Schema
query { __schema { types { name kind } queryType { name } } }
Campos de Introspecção
__schemaConsultar tipos e diretivas do schema
__type(name:)Consultar um tipo específico por nome
__typenameRetorna o nome do tipo de qualquer objeto
Padrões Comuns
Paginação (estilo Relay)
query { users(first: 10, after: "cursor") { edges { node { name } cursor } pageInfo { hasNextPage } } }
Tratamento de Erros
{ "data": { "user": null }, "errors": [{ "message": "Not found", "path": ["user"] }] }
Boas Práticas
Name operationsSempre nomear queries e mutations
Use variablesNunca interpolar valores em strings de query
Request only needed fieldsEvitar over-fetching com seleções precisas
Use fragmentsCompartilhar conjuntos de campos entre queries