Criando uma API
Criando uma APIAdicionando cache HTTP

Adicionando cache HTTP

Quando as queries são executadas contra o servidor GraphQL usando GET (em vez do método mais tradicional POST), a resposta GraphQL pode ser armazenada em cache no lado do cliente ou em estágios intermediários entre o cliente e o servidor (como um CDN), utilizando o cache HTTP padrão.

Isso funciona naturalmente para persisted queries, e para o single endpoint e custom endpoints pode funcionar adicionando o parâmetro ?query={ GraphQL query } ao endpoint.

A configuração é criada por meio de uma lista de controle de cache, e entregue ao endpoint via configuração de schema.

Executando o endpoint via GET

As persisted queries já são adequadas para serem executadas via GET, pois armazenam a query GraphQL no servidor (ou seja, ela não precisa ser fornecida no corpo da requisição).

Para o single endpoint e custom endpoints, porém, a query deve ser fornecida no parâmetro ?query=... anexado à URL do endpoint.

Por exemplo, a seguinte query GraphQL:

{
  posts {
    id
    title
    url
    author {
      id
      name
      url
    }
  }
}

...pode ser executada via GET contra o single endpoint assim:

https://mysite.com/graphql/?query={ posts { id title url author { id name url } } }

Cálculo automático do max-age

O valor max-age da resposta é calculado automaticamente a partir das listas de controle de acesso atribuídas ao endpoint (via configuração de schema).

Este valor é o menor valor de max-age entre todos os campos e directives na query solicitada, ou no-store se:

  • alguma mutation for executada
  • algum campo ou directive tiver max-age com valor 0
  • uma regra de controle de acesso precisar verificar o estado do usuário para algum campo ou directive (nesse caso, a resposta é específica para o usuário e não pode ser armazenada em cache)

Max-age padrão

Campos que não receberam um max-age específico usarão o valor padrão, definido na Configuração de Schema:

Valor max-age padrão na Configuração de Schema

Se não definido, será usado o valor max-age padrão definido na página de Configurações, na aba "Cache Control". Este valor, que é 86400 segundos, pode ser modificado nas Configurações.

Exemplo

Suponhamos que temos a seguinte configuração de valores max-age para campos do tipo User:

  • name => 600
  • url => 30

Então, a resposta a esta query terá o valor max-age definido como 86400 (porque nem displayName nem email foram configurados, portanto usam o valor padrão):

query {
  users {
    displayName
    email
  }
}

A resposta a esta query terá o valor max-age definido como 30 (correspondente a url, que é o menor valor entre todos os campos configurados):

query {
  user(by: {id: 1}) {
    name
    url
  }
}

A resposta a esta query terá o valor max-age definido como no-store (porque o campo me requer estado do usuário):

query {
  me {
    name
    url
  }
}

A resposta a esta query terá o valor max-age definido como no-store (porque executa uma mutation):

mutation {
  createPost {
    id
  }
}

Acessando todas as listas de controle de cache

Clicando em "Cache Control Lists" no menu do plugin, é exibida a lista de todas as listas de controle de cache criadas:

Listas de controle de cache no painel administrativo
Listas de controle de cache no painel administrativo

Criando uma nova lista de controle de cache

Clique no botão "Add New Cache Control List" para abrir o editor do WordPress:

Criando uma lista de controle de cache

Dê um título à lista de controle de cache, adicione entradas com campos e directives, e configure o valor max-age para cada um:

Criando uma lista de controle de cache

Quando estiver pronto, clique no botão Publish. A nova lista de controle de cache ficará então disponível para a configuração de schema.

Entradas de Cache Control

Cada lista de controle de cache contém uma ou várias entradas, cada uma com os seguintes elementos:

  • Os campos para os quais configurar o cache
  • Os directives para os quais configurar o cache
  • O valor max-age para cada um

Entrada de controle de acesso

Selecionando campos de interfaces

Além de campos de tipos, também podemos selecionar campos de interfaces. Nesse caso, o valor max-age é aplicado ao consultar esses campos a partir de qualquer tipo que implemente a interface.

Selecionando um campo de uma interface
Selecionando um campo de uma interface

Descrevendo a lista de controle de cache

Use o campo "Excerpt", no painel de configurações do documento, para fornecer uma descrição à lista de controle de cache.

Veja mais informações no guia Adicionando uma descrição à API.

Usando a lista de controle de cache

Após criar a lista de controle de cache, podemos fazer com que o Custom Endpoint ou a Persisted Query a utilize editando a Configuração de Schema correspondente, e selecionando a ACL na lista do bloco "Cache Control Lists".

Selecionando uma lista de controle de cache na Configuração de Schema

Se a configuração não for personalizada, serão usadas as listas de controle de cache padrão definidas na página de Configurações, na aba "Cache Control":

Selecionando as listas de controle de cache padrão na página de Configurações