API GraphQL do AEM para uso com Fragmentos de conteúdo

Saiba como usar os Fragmentos de conteúdo no Adobe Experience Manager (AEM) as a Cloud Service com a API GraphQL do AEM, para entrega de conteúdo headless.

A API GraphQL do AEM as a Cloud Service utilizada com Fragmentos de conteúdo é baseada na API GraphQL padrão de código aberto.

Usar a API GraphQL no AEM permite a entrega eficiente dos Fragmentos de conteúdo aos clientes JavaScript em implementações CMS headless:

  • Evitando solicitações de API iterativas como com REST,
  • Garantindo que a entrega se limite aos requisitos específicos,
  • Permitindo a entrega em massa exatamente daquilo que é necessário para a renderização, como resposta a uma única consulta de API.
OBSERVAÇÃO

O GraphQL é usado atualmente em dois cenários (separados) no Adobe Experience Manager (AEM) as a Cloud Service:

A API GraphQL

O GraphQL é:

  • "…um idioma de consulta para APIs e um tempo de execução para realizar essas consultas com seus dados existentes. O GraphQL fornece uma descrição completa e compreensível dos dados em sua API, concede aos clientes nada além do poder de solicitar exatamente o que precisam, facilita a evolução das APIs ao longo do tempo e habilita ferramentas avançadas de desenvolvedor.".

    Consulte GraphQL.org

  • "…uma especificação aberta para uma camada de API flexível. Coloque o GraphQL sobre seus back-end existentes para criar produtos mais rápido do que nunca…".

    Consulte Explorar GraphQL.

  • "…uma linguagem de consulta de dados e especificação desenvolvidas internamente pelo Facebook em 2012, antes de serem disponibilizadas publicamente em 2015. Ele oferece uma alternativa às arquiteturas baseadas em REST, com o objetivo de aumentar a produtividade do desenvolvedor e minimizar as quantidades de dados transferidos. O GraphQL é usado na produção por centenas de organizações de todos os tamanhos…"

    Consulte Fundação GraphQL.

Para obter mais informações sobre a API GraphQL, consulte as seguintes seções (entre muitos outros recursos):

A implementação do GraphQL para AEM é baseada na Biblioteca GraphQL Java padrão. Consulte:

Terminologia de GraphQL

O GraphQL usa o seguinte:

Consulte a Introdução ao GraphQL (GraphQL.org) para obter detalhes abrangentes, incluindo as Práticas recomendadas.

Tipos de consulta de GraphQL

Com o GraphQL, é possível executar consultas para retornar:

AEM fornece recursos para converter consultas (ambos os tipos) em Consultas Persistentes, que podem ser armazenadas em cache por Dispatcher e CDN.

Práticas recomendadas de consulta do GraphQL (Dispatcher e CDN)

O Consultas Persistentes são o método recomendado a ser usado em instâncias de publicação como:

  • são armazenadas em cache
  • são gerenciadas de forma central pelo AEM as a Cloud Service
OBSERVAÇÃO

Geralmente, não há dispatcher/CDN no autor, portanto, não há mais vantagem em usar consultas persistentes lá; além de testá-los.

As consultas do GraphQL que usam solicitações POST não são recomendadas, pois não são armazenadas em cache. Portanto, em uma instância padrão, o Dispatcher é configurado para bloquear essas consultas.

Embora o GraphQL também ofereça suporte a solicitações do GET, elas podem atingir limites (por exemplo, o comprimento do URL) que podem ser evitados usando Consultas Persistentes.

OBSERVAÇÃO

Para permitir consultas diretas e/ou POST no Dispatcher, você pode solicitar que o administrador do sistema:

OBSERVAÇÃO

A capacidade de realizar consultas diretas pode se tornar obsoleta em algum momento no futuro.

IDE GraphiQL

É possível testar e depurar consultas de GraphQL usando o IDE GraphiQL.

Casos de uso para ambientes de Autor e Publicação

Os casos de uso podem depender do tipo de ambiente do AEM as a Cloud Service:

  • Ambiente de publicação; usado para:

    • Consultar dados para o aplicativo JS (caso de uso padrão)
  • Ambiente de autor; usado para:

    • Consultar dados para “fins de gerenciamento de conteúdo”:
      • Atualmente, o GraphQL no AEM as a Cloud Service é uma API somente de leitura.
      • A API REST pode ser usada para operações de CR(u)D.

Permissões

As permissões são as necessárias para acessar o Assets.

As consultas do GraphQL são executadas com a permissão do usuário AEM da solicitação subjacente. Se o usuário não tiver acesso de leitura a alguns fragmentos (armazenados como Ativos), ele não fará parte do conjunto de resultados.

Além disso, o usuário precisa ter acesso a um terminal GraphQL para poder executar consultas do GraphQL.

Geração de esquemas

O GraphQL é uma API altamente tipificada, o que significa que os dados devem ser estruturados e organizados claramente por tipo.

A especificação GraphQL fornece uma série de diretrizes sobre como criar uma API robusta para interrogar dados em uma determinada instância. Para fazer isso, um cliente precisa buscar o Esquema, que contém todos os tipos necessários para uma consulta.

Para fragmentos de conteúdo, os esquemas de GraphQL (estrutura e tipos) são baseados em modelos de fragmento de conteúdo habilitados e seus tipos de dados.

ATENÇÃO

Todos os esquemas de GraphQL (derivados dos modelos de fragmento de conteúdo que foram Habilitados) são legíveis por meio do endpoint do GraphQL.

Isso significa que você precisa garantir que não haja dados confidenciais disponíveis, pois eles poderiam ser vazados dessa maneira; por exemplo, isso inclui informações que podem estar presentes como nomes de campo na definição do modelo.

Por exemplo, se um usuário criou um Modelo de fragmento de conteúdo chamado Articlee AEM gera um tipo GraphQL ArticleModel. Os campos desse tipo correspondem aos campos e tipos de dados definidos no modelo. Além disso, ele cria alguns pontos de entrada para as queries que operam nesse tipo, como articleByPath ou articleList.

  1. Um modelo de fragmento de conteúdo:

    Modelo de fragmento de conteúdo para uso com GraphQL
  2. O esquema de GraphQL correspondente (saída da documentação automática do GraphiQL):
    Esquema de GraphQL com base no modelo de fragmento de conteúdo

    Isso mostra que o tipo gerado ArticleModel contém vários campos.

    • Três deles foram controlados pelo usuário: author, main e referencearticle.

    • Os outros campos foram adicionados automaticamente por AEM e representam métodos úteis para fornecer informações sobre um determinado Fragmento de conteúdo; neste exemplo, (a variável campos auxiliares) _path, _metadata, _variations.

  3. Depois que um usuário cria um fragmento de conteúdo com base no modelo de Artigo, ele pode ser interrogado por meio do GraphQL. Para obter exemplos, consulte Exemplos de consulta (baseado em uma amostra da estrutura do fragmento de conteúdo para uso com GraphQL).

No GraphQL para AEM, o esquema é flexível. Isso significa que ele é gerado automaticamente toda vez que um modelo de fragmento de conteúdo é criado, atualizado ou excluído. Os caches do esquema de dados também são atualizados quando você atualiza um modelo de fragmento de conteúdo.

Os caches do esquema de dados também são atualizados quando você atualiza um modelo de fragmento de conteúdo.

O serviço GraphQL do Sites acompanha (em segundo plano) quaisquer modificações feitas em um modelo de fragmento de conteúdo. Quando as atualizações são detectadas, somente essa parte do esquema é gerada novamente. Essa otimização economiza tempo e oferece estabilidade.

Por exemplo, se você:

  1. Instalar um pacote contendo Content-Fragment-Model-1 e Content-Fragment-Model-2:

    1. Os tipos de GraphQL para Model-1 e Model-2 serão gerados.
  2. Em seguida, o Content-Fragment-Model-2 é modificado:

    1. Somente o tipo de GraphQL para Model-2 será atualizado.

    2. Já o Model-1 permanecerá o mesmo.

OBSERVAÇÃO

É importante observar isso caso queira fazer atualizações em massa nos modelos de fragmento de conteúdo por meio da API REST ou de outra maneira.

O esquema é distribuído por meio do mesmo endpoint das consultas de GraphQL, com o cliente lidando com o fato de que o esquema é chamado com a extensão GQLschema. Por exemplo, executar uma simples solicitação GET em /content/cq:graphql/global/endpoint.GQLschema resultará na saída do esquema com o tipo do conteúdo: text/x-graphql-schema;charset=iso-8859-1.

Geração de esquema - Modelos não publicados

Quando os fragmentos de conteúdo são aninhados, pode acontecer que um modelo de fragmento de conteúdo principal seja publicado, mas um modelo referenciado não.

OBSERVAÇÃO

A interface do AEM impede que isso aconteça, mas se a publicação for feita de maneira programática ou com pacotes de conteúdo, isso poderá ocorrer.

Quando isso acontece, o AEM gera um esquema incompleto do modelo de fragmento de conteúdo principal. Isso significa que a referência do fragmento, que depende do modelo não publicado, é removida do esquema.

Campos

Dentro do esquema há campos individuais de duas categorias básicas:

  • Campos gerados.

    Uma seleção de Tipos de dados são usados para criar campos com base em como você configura o Modelo de fragmento de conteúdo. Os nomes de campo são retirados do Nome da propriedade do Tipo de dados guia .

    • Há também o Renderizar como configuração para considerar, já que os usuários podem configurar determinados tipos de dados. Por exemplo, um campo de texto de linha única pode ser configurado para conter vários textos de linha única escolhendo multifield na lista suspensa.
  • O GraphQL do AEM também gera vários campos auxiliares.

Tipos de dados

O GraphQL do AEM oferece suporte a uma lista de tipos. Todos os tipos de dados do modelo de fragmento de conteúdo compatíveis e os tipos de GraphQL correspondentes são representados:

Modelo de fragmento de conteúdo - Tipo de dados Tipo de GraphQL Descrição
Texto em linha única Sequência de caracteres, [Sequência de caracteres] Usado para sequências de caracteres simples, como nomes de autor, nomes de localização etc.
Texto multilinha Sequência de caracteres, [Sequência de caracteres] Usado para saída de texto, como o corpo de um artigo
Número Flutuante, [Flutuante] Usado para exibir números de ponto flutuantes e números regulares
Booleano Booleano Usado para exibir caixas de seleção → declarações simples de verdadeiro/falso
Data e hora Calendário Usado para exibir data e hora em um formato ISO 8601. Dependendo do tipo selecionado, há três opções disponíveis para uso no GraphQL do AEM: onlyDate, onlyTime e dateTime
Enumeração Sequência de caracteres Usado para exibir uma opção de uma lista de opções definidas na criação do modelo
Tags [Sequência de caracteres] Usado para exibir uma lista de sequências de caracteres que representam tags usadas no AEM
Referência de conteúdo Sequência de caracteres, [Sequência de caracteres] Usado para exibir o caminho para outro ativo no AEM
Referência do fragmento Um tipo de modelo Usado para fazer referência a outro Fragmento de conteúdo de um determinado Tipo de modelo, definido quando o modelo foi criado

Campos auxiliares

Além dos tipos de dados para campos gerados pelo usuário, o GraphQL para AEM também gera vários campos auxiliares para ajudar a identificar um Fragmento de conteúdo ou fornecer informações adicionais sobre um Fragmento de conteúdo.

Esses campos auxiliares estão marcados com um _ precedente, para distinguir entre o que foi definido pelo usuário e o que foi gerado automaticamente.

Caminho

O campo path é usado como um identificador AEM GraphQL. Ele representa o caminho do ativo Fragmento de conteúdo dentro do repositório do AEM. Optamos por isso como o identificador de um Fragmento de conteúdo, pois ele:

  • é exclusivo dentro do AEM,
  • pode ser buscado facilmente.

O código a seguir exibirá os caminhos de todos os Fragmentos de conteúdo que foram criados com base no Modelo do Fragmento de conteúdo Author, conforme fornecido pelo tutorial WKND.

{
  authorList {
    items {
      _path
    }
  }
}

Para recuperar um único Fragmento de conteúdo de um tipo específico, também é necessário determinar seu caminho primeiro. Por exemplo:

{
  authorByPath(_path: "/content/dam/wknd-shared/en/contributors/sofia-sj-berg") {
    item {
      _path
      firstName
      lastName
    }
  }
}

Consulte Exemplo de consulta - um único fragmento específico de cidade.

Metadados

Por meio do GraphQL, o AEM também expõe os metadados de um Fragmento de conteúdo. Metadados são as informações que descrevem um Fragmento de conteúdo, como o título de um Fragmento de conteúdo, o caminho de miniatura, a descrição de um Fragmento de conteúdo, a data em que ele foi criado, entre outros.

Como os metadados são gerados por meio do Editor de esquemas e, como tal, não têm uma estrutura específica, o GraphQL tipo TypedMetaData foi implementado para expor os metadados de um Fragmento de conteúdo. TypedMetaData expõe as informações agrupadas pelos seguintes tipos escalares:

Texto
stringMetadata:[StringMetadata]!
stringArrayMetadata:[StringArrayMetadata]!
intMetadata:[IntMetadata]!
intArrayMetadata:[IntArrayMetadata]!
floatMetadata:[FloatMetadata]!
floatArrayMetadata:[FloatArrayMetadata]!
booleanMetadata:[BooleanMetadata]!
booleanArrayMetadata:[booleanArrayMetadata]!
calendarMetadata:[CalendarMetadata]!
calendarArrayMetadata:[CalendarArrayMetadata]!

Cada tipo escalar representa um único par de nome-valor ou uma matriz de pares de nome-valor, em que o valor desse par é do tipo em que foi agrupado.

Por exemplo, se você quiser recuperar o título de um Fragmento de conteúdo, sabemos que essa é uma propriedade de String; portanto, consultaríamos todos os metadados de String:

Para consultar metadados:

{
  authorByPath(_path: "/content/dam/wknd-shared/en/contributors/sofia-sj-berg") {
    item {
      _metadata {
        stringMetadata {
          name
          value
        }
      }
    }
  }
}

É possível exibir todos os tipos de metadados GraphQL, se você exibir o esquema GraphQL gerado. Todos os tipos de modelo têm o mesmo TypedMetaData.

OBSERVAÇÃO

Diferença entre metadados normais e de matriz
Lembre-se que StringMetadata e StringArrayMetadata se referem ao que é armazenado no repositório, não a como você os recupera.

Por exemplo, ao chamar o campo stringMetadata, você receberia uma matriz de todos os metadados que foram armazenados no repositório como um String; e ao chamar stringArrayMetadata, você receberia uma matriz de todos os metadados que foram armazenados no repositório como String[].

Consulte Exemplo de consulta para metadados - listar os metadados para prêmios denominados GB.

Variações

O campo _variations foi implementado para simplificar a consulta das variações que um Fragmento de conteúdo possui. Por exemplo:

{
  authorByPath(_path: "/content/dam/wknd-shared/en/contributors/ian-provo") {
    item {
      _variations
    }
  }
}
OBSERVAÇÃO

Observe que a variável _variations não contém um master , como tecnicamente os dados originais (referenciados como Principal na interface do usuário) não é considerada uma variação explícita.

Consulte Exemplo de consulta - todas as cidades com uma variável nomeada.

OBSERVAÇÃO

Se a variação especificada não existir para um Fragmento de conteúdo, os dados originais (também conhecidos como variação principal) serão retornados como um padrão (fallback).

Variáveis GraphQL

O GraphQL permite que as variáveis sejam colocadas na consulta. Para obter mais informações, é possível visualizar a documentação do GraphQL sobre variáveis.

Por exemplo, para obter todos os Fragmentos de conteúdo do tipo Author em uma variação específica (se disponível), é possível especificar o argumento variation em GraphiQL.

Variáveis GraphQL

Consulta:

query($variation: String!) {
  authorList(variation: $variation) {
    items {
      _variation
      lastName
      firstName
    }
  }
}

Variáveis de consulta:

{
  "variation": "another"
}

Esse query retornará a lista completa de autores. Autores sem o another voltará aos dados originais (_variation relatório master neste caso).

Se quiser restringir a lista aos autores que fornecem a variação especificada (e ignorar autores que retornariam aos dados originais), será necessário aplicar um filter:

query($variation: String!) {
  authorList(variation: $variation, filter: {
    _variation: {
      _expressions: {
        value: $variation
      }
    }
  }) {
    items {
      _variation
      lastName
      firstName
    }
  }
}

Diretivas GraphQL

No GraphQL, há uma possibilidade de alterar a consulta com base em variáveis, chamadas de Diretivas GraphQL.

Por exemplo, é possível incluir o campo adventurePrice em uma consulta para todos os AdventureModels, com base em uma variável includePrice.

Diretivas de GraphQL

Consulta:

query GetAdventureByType($includePrice: Boolean!) {
  adventureList {
    items {
      title
      price @include(if: $includePrice)
    }
  }
}

Variáveis de consulta:

{
    "includePrice": true
}

Filtragem

Também é possível usar a filtragem em consultas de GraphQL para retornar dados específicos.

A filtragem usa uma sintaxe baseada em operadores lógicos e expressões.

A parte mais atômica é uma única expressão que pode ser aplicada ao conteúdo de um determinado campo. Ele compara o conteúdo do campo com um determinado valor constante.

Por exemplo, a expressão

{
  value: "some text"
  _op: EQUALS
}

compararia o conteúdo do campo com o valor some text e é bem-sucedido se o conteúdo for igual ao valor. Caso contrário, a expressão falhará.

As ações

Os operadores a seguir podem ser usados para comparar campos com um determinado valor:

Operador Tipo(s) A expressão terá êxito se …
EQUALS String, ID, Boolean … o valor é exatamente o mesmo que o conteúdo do campo
EQUALS_NOT String, ID … o valor é not igual ao conteúdo do campo
CONTAINS String … o conteúdo do campo contém o valor ({ value: "mas", _op: CONTAINS } corresponderá Christmas, Xmas, master, …)
CONTAINS_NOT String … o conteúdo do campo faz not contém o valor
STARTS_WITH ID … a ID começa com um determinado valor ({ value: "/content/dam/", _op: STARTS_WITH corresponderá /content/dam/path/to/fragment, mas não /namespace/content/dam/something
EQUAL Int, Float … o valor é exatamente o mesmo que o conteúdo do campo
UNEQUAL Int, Float … o valor é not igual ao conteúdo do campo
GREATER Int, Float … o conteúdo do campo é maior que o valor
GREATER_EQUAL Int, Float … o conteúdo do campo é maior ou igual ao valor
LOWER Int, Float … o conteúdo do campo é menor que o valor
LOWER_EQUAL Int, Float … o conteúdo do campo é menor ou igual ao valor
AT Calendar, Date, Time … o conteúdo do campo é exatamente o mesmo que o valor (incluindo a configuração de fuso horário)
NOT_AT Calendar, Date, Time … o conteúdo do campo é not igual ao valor
BEFORE Calendar, Date, Time … o ponto no tempo indicado pelo valor é antes do ponto no tempo indicado pelo conteúdo do campo
AT_OR_BEFORE Calendar, Date, Time … o ponto no tempo indicado pelo valor é antes ou no mesmo ponto no tempo indicado pelo conteúdo do campo
AFTER Calendar, Date, Time … o ponto no tempo indicado pelo valor é após o ponto no tempo indicado pelo conteúdo do campo
AT_OR_AFTER Calendar, Date, Time … o ponto no tempo indicado pelo valor é depois ou no mesmo ponto no tempo indicado pelo conteúdo do campo

Alguns tipos também permitem especificar opções adicionais que modificam como uma expressão é avaliada:

Opção Tipo(s) Descrição
_ignoreCase String Ignora o caso de uma string, por exemplo, um valor de time corresponderá TIME, time, tImE, …
_sensitiveness Float Permite uma certa margem para float valores a serem considerados iguais (para contornar limitações técnicas devido à representação interna de float valores; deve ser evitada, pois essa opção pode ter um impacto negativo no desempenho

As expressões podem ser combinadas a um conjunto com a ajuda de um operador lógico (_logOp):

  • OR - o conjunto de expressões terá êxito se pelo menos uma expressão tiver êxito
  • AND - o conjunto de expressões terá êxito se todas as expressões tiverem êxito (padrão)

Cada campo pode ser filtrado por seu próprio conjunto de expressões. Os conjuntos de expressões de todos os campos mencionados no argumento filter serão combinados pelo seu próprio operador lógico.

Uma definição de filtro (passada como filter para um query) contém:

  • Uma subdefinição para cada campo (o campo pode ser acessado por meio de seu nome, por exemplo, há uma lastName no filtro para a variável lastName no campo Data (campo) Type (Tipo de dados)
  • Cada subdefinição contém a variável _expressions , fornecendo o conjunto de expressões e o _logOp que define o operador lógico com o qual as expressões devem ser combinadas
  • Cada expressão é definida pelo valor (value ) e o operador (_operator ) o conteúdo de um campo deve ser comparado a

Observe que você pode omitir _logOp se quiser combinar itens com AND e _operator se quiser verificar a igualdade, pois esses são os valores padrão.

O exemplo a seguir demonstra um query completa que filtra todas as pessoas que têm um lastName de Provo ou contendo sjö, independentemente do caso:

{
  authorList(filter: {
    lastname: {
      _logOp: OR
      _expressions: [
        {
          value: "sjö",
          _operator: CONTAINS,
          _ignoreCase: true
        },
        {
          value: "Provo"
        }
      ]
    }
  }) {
    items {
      lastName
      firstName
    }
  }
}

Embora também seja possível filtrar em campos aninhados, isso não é recomendado, pois pode levar a problemas de desempenho.

Para obter mais exemplos, consulte:

Classificação

Esse recurso permite classificar os resultados da consulta de acordo com um campo especificado.

Os critérios de classificação:

  • é uma lista de valores separada por vírgulas que representa o caminho do campo
    • o primeiro campo na lista definirá a ordem de classificação primária, o segundo campo será usado se dois valores do critério de classificação principal forem iguais, o terceiro se os dois primeiros critérios forem iguais, etc.
    • notação pontilhada, ou seja, field1.subfield.subfield etc…
  • com uma direção de ordem opcional
    • ASC (ascendente) ou DESC (descendente); como o ASC padrão é aplicado
    • a direção pode ser especificada por campo; isso significa que você pode classificar um campo em ordem crescente, outro em ordem decrescente (nome, nome DESC)

Por exemplo:

query {
  authorList(sort: "lastName, firstName") {
    items {
      firstName
      lastName
    }
  }
}

E também:

{
  authorList(sort: "lastName DESC, firstName DESC") {
    items {
        lastName
        firstName
    }
  }
}

Também é possível classificar em um campo dentro de um fragmento aninhado, usando o formato de nestedFragmentname.fieldname.

OBSERVAÇÃO

Isso pode ter um impacto negativo no desempenho.

Por exemplo:

query {
  articleList(sort: "authorFragment.lastName")  {
    items {
      title
      authorFragment {
        firstName
        lastName
        birthDay
      }
      slug
    }
  }
}

Paginação

Esse recurso permite executar paginação em tipos de query que retornam uma lista. São fornecidos dois métodos:

  • offset e limit em List query
  • first e after em Paginated query

Consulta de lista - deslocamento e limite

Em um ...Listconsulta que você pode usar offset e limit para retornar um subconjunto específico de resultados:

  • offset: Especifica o primeiro conjunto de dados a ser retornado
  • limit: Especifica o número máximo de conjuntos de dados a serem retornados

Por exemplo, para exibir a página de resultados contendo até cinco artigos, a partir do quinto artigo da complete lista de resultados:

query {
   articleList(offset: 5, limit: 5) {
    items {
      authorFragment {
        lastName
        firstName
      }
    }
  }
}
OBSERVAÇÃO
  • A paginação requer uma ordem de classificação estável para funcionar corretamente em vários queries, solicitando páginas diferentes do mesmo conjunto de resultados. Por padrão, ele usa o caminho do repositório de cada item do conjunto de resultados para garantir que a ordem seja sempre a mesma. Se uma ordem de classificação diferente for usada e essa classificação não puder ser feita no nível de consulta JCR, haverá um impacto negativo no desempenho, pois todo o conjunto de resultados deverá ser carregado na memória antes que as páginas possam ser determinadas.

  • Quanto maior o deslocamento, mais tempo levará para ignorar os itens do conjunto completo de resultados da consulta JCR. Uma solução alternativa para grandes conjuntos de resultados é usar a consulta Paginada com first e after método .

Consulta paginada - primeiro e depois

O ...Paginated O tipo de consulta reutiliza a maioria dos ...List recursos do tipo de consulta (filtragem, classificação), mas em vez de usar offset/limit argumentos, ele usa a variável first/after argumentos definidos por a Especificação de Conexões do Cursor GraphQL. Você pode encontrar uma introdução menos formal no Introdução ao GraphQL.

  • first: O n primeiro itens a retornar.
    O padrão é 50.
    O máximo é 100.
  • after: O cursor que determina o início da página solicitada; observe que o item representado pelo cursor não está incluído no conjunto de resultados; o cursor de um item é determinado pela variável cursor do edges estrutura.

Por exemplo, crie a saída da página de resultados contendo até cinco aventuras, começando pelo item de cursor especificado na variável complete lista de resultados:

query {
    adventurePaginated(first: 5, after: "ODg1MmMyMmEtZTAzMy00MTNjLThiMzMtZGQyMzY5ZTNjN2M1") {
        edges {
          cursor
          node {
            title
          }
        }
        pageInfo {
          endCursor
          hasNextPage
        }
    }
}
OBSERVAÇÃO
  • Por padrão, a paginação usa o UUID do nó do repositório que representa o fragmento para solicitar, a fim de garantir que a ordem dos resultados seja sempre a mesma. When sort for usada, a UUID será usada implicitamente para garantir uma classificação exclusiva; mesmo para dois itens com chaves de classificação idênticas.

  • Devido a restrições técnicas internas, o desempenho será degradado se a classificação e a filtragem forem aplicadas em campos aninhados. Portanto, é recomendável usar campos de filtro/classificação armazenados no nível raiz. Essa também é a maneira recomendada se você quiser consultar grandes conjuntos de resultados paginados.

GraphQL para AEM - resumo das extensões

A operação básica de consultas com o GraphQL para AEM adere à especificação GraphQL padrão. Para consultas de GraphQL com o AEM, há algumas extensões:

Consultar o endpoint do GraphQL a partir de um site externo

Para acessar o endpoint do GraphQL a partir de um site externo, é necessário configurar o:

Autenticação

Consulte Autenticação para consultas de GraphQL remotas do AEM sobre fragmentos de conteúdo.

Perguntas frequentes

Perguntas que surgiram:

  1. P: “Qual a diferença entre a API GraphQL do AEM e a API do Construtor de consultas?

    • R: “A API GraphQL do AEM oferece controle total sobre a saída em JSON e é um padrão do setor para consulta de conteúdo.
      A partir de agora, o AEM planeja investir na API GraphQL do AEM.

Tutorial - Introdução ao AEM Headless e GraphQL

Procurando um tutorial prático? Veja o tutorial completo de Introdução ao AEM Headless e GraphQL que ilustra como criar e expor conteúdo usando as APIs GraphQL do AEM e consumi-lo por meio de um aplicativo externo, em um cenário de CMS headless.

Nesta página