API GraphQL
GraphQL è:
-
“…un linguaggio di query per le API e un runtime per l’esecuzione di tali query con i dati esistenti. GraphQL fornisce una descrizione completa e comprensibile dei dati nell’API, offre ai clienti la possibilità di chiedere esattamente ciò di cui hanno bisogno e niente di più, semplifica l’evoluzione delle API nel tempo e abilita potenti strumenti per gli sviluppatori.”.
Vedi GraphQL.org
-
“…una specifica aperta per un livello API flessibile. Posiziona GraphQL sui backend esistenti per costruire prodotti più rapidamente che mai…”.
Vedi Esplorare GraphQL.
-
“…un linguaggio e una specifica di query di dati sviluppati internamente da Facebook nel 2012 prima di essere resi open source nel 2015. Offre un’alternativa alle architetture basate su REST allo scopo di aumentare la produttività degli sviluppatori e ridurre al minimo le quantità di dati trasferiti. GraphQL viene utilizzato in produzione da centinaia di organizzazioni di tutte le dimensioni…”
Vedi GraphQL Foundation.
Per ulteriori informazioni sull’API GraphQL, consulta le sezioni seguenti (tra molte altre risorse):
L’implementazione di GraphQL per AEM si basa sulla libreria Java GraphQL standard. Consulta:
Terminologia GraphQL
GraphQL utilizza quanto segue:
-
- Gli schemi vengono generati da AEM in base ai modelli di Frammenti di contenuto.
- Utilizzando i tuoi schemi, GraphQL presenta i tipi e le operazioni consentiti per l’implementazione GraphQL per AEM.
-
-
Il percorso in AEM che risponde alle query GraphQL e fornisce accesso agli schemi GraphQL.
-
Consulta Abilitazione dell’endpoint GraphQL per ulteriori dettagli.
-
Consulta(GraphQL.org) Introduzione a GraphQL per informazioni complete, che comprendono le Best practice.
Tipi di query GraphQL
Con GraphQL è possibile eseguire query per ottenere:
-
Un ingresso singolo
AEM fornisce funzionalità per convertire le query (entrambi i tipi) in Query persistenti, che possono essere memorizzate nella cache da Dispatcher e CDN.
Best practice per le query GraphQL (Dispatcher e CDN)
Le Query persistenti sono il metodo consigliato da utilizzare nelle istanze di pubblicazione come:
- vengono memorizzate nella cache;
- sono gestite centralmente da AEM as a Cloud Service
Le query GraphQL con l’utilizzo di POST non sono consigliate in quanto non sono memorizzate nella cache. Quindi, in un’istanza predefinita, Dispatcher è configurato per bloccarle.
Anche se GraphQL supporta le richieste GET, queste possono raggiungere dei limiti (ad esempio, la lunghezza dell’URL) che possono essere evitati utilizzando query persistenti.
Per ulteriori dettagli, vedere Abilitare la memorizzazione nella cache delle query persistenti.
- Creare una variabile di ambiente Cloud Manager denominata
ENABLE_GRAPHQL_ENDPOINT
- con il valore
true
IDE GraphiQL
Puoi testare ed eseguire il debug delle query GraphQL utilizzando IDE GraphiQL.
Casi d’uso per authoring, anteprima e pubblicazione
I casi di utilizzo possono dipendere dal tipo di ambiente AEM as a Cloud Service:
-
ambiente di pubblicazione; utilizzato per:
- effettuare query sui dati per l’applicazione JS (caso di utilizzo standard)
-
Ambiente di anteprima; utilizzato per:
- Anteprima delle query prima della distribuzione nell’ambiente di pubblicazione
- effettuare query sui dati per l’applicazione JS (caso di utilizzo standard)
- Anteprima delle query prima della distribuzione nell’ambiente di pubblicazione
-
ambiente di authoring; utilizzato per:
-
effettuare query sui dati a “scopo di gestione dei contenuti”:
- GraphQL in AEM as a Cloud Service è attualmente un’API di sola lettura.
- L’API REST può essere utilizzata per le operazioni CR(u)D.
-
Autorizzazioni
Le autorizzazioni sono quelle necessarie per accedere ad Assets.
Le query GraphQL vengono eseguite con l’autorizzazione dell’utente AEM della richiesta sottostante. Se l’utente non dispone dell’accesso in lettura ad alcuni frammenti (memorizzati come risorse), questi non faranno parte del set di risultati.
Inoltre, l’utente deve avere accesso a un endpoint GraphQL per poter eseguire le query GraphQL.
Generazione schema
GraphQL è un’API fortemente tipizzata, il che significa che i dati devono essere chiaramente strutturati e organizzati per tipo.
La specifica GraphQL fornisce una serie di linee guida su come creare una solida API per l’interrogazione dei dati su una determinata istanza. Per eseguire questa operazione, un client deve recuperare lo schema, che contiene tutti i tipi necessari per una query.
Per quanto riguarda i Frammenti di contenuto, gli schemi GraphQL (struttura e tipi) sono basati su modelli di Frammenti di contenuto abilitati e i relativi tipi di dati.
Ad esempio, se un utente ha creato un modello di frammento di contenuto denominato Article
, AEM genera un tipo GraphQL ArticleModel
. I campi all’interno di questo tipo corrispondono ai campi e ai tipi di dati definiti nel modello. Inoltre, crea alcuni punti di ingresso per le query che operano su questo tipo, come articleByPath
o articleList
.
-
Modello di Frammento di contenuto:
-
Lo schema GraphQL corrispondente (output dalla documentazione automatica GraphiQL):
Questo mostra che il tipo
ArticleModel
generato contiene diversi campi.-
Tre di essi sono stati controllati dall’utente:
author
,main
ereferencearticle
. -
Gli altri campi sono stati aggiunti automaticamente da AEM e rappresentano metodi utili per fornire informazioni su un determinato Frammento di contenuto; in questo esempio (i campi di supporto)
_path
,_metadata
,_variations
.
-
-
Un Frammento di contenuto basato sul modello di articolo creato da un utente può essere interrogato tramite GraphQL. Per esempi, consulta la sezione Query di esempio (basata su una struttura di Frammento di contenuto di esempio da utilizzare con GraphQL).
In GraphQL per AEM, lo schema è flessibile. Ciò significa che viene generato automaticamente ogni volta che viene creato, aggiornato o eliminato un modello di Frammento di contenuto. Le cache dello schema dati vengono aggiornate anche quando si rivede un modello di Frammento di contenuto.
Le cache dello schema dati vengono aggiornate anche quando si rivede un modello di Frammento di contenuto.
Il servizio GraphQL di Sites ascolta (in background) le modifiche apportate a un modello di Frammento di contenuto. Quando vengono rilevati aggiornamenti, viene rigenerata solo la parte dello schema. Questa ottimizzazione consente di risparmiare tempo e garantisce stabilità.
Ad esempio, se:
-
Installi un pacchetto contenente
Content-Fragment-Model-1
eContent-Fragment-Model-2
:- sono generati tipi di GraphQL per
Model-1
eModel-2
.
- sono generati tipi di GraphQL per
-
Poi modifica
Content-Fragment-Model-2
:-
verrà aggiornato solo il tipo GraphQL
Model-2
. -
mentre
Model-1
rimarrà lo stesso.
-
Lo schema viene gestito attraverso lo stesso endpoint delle query GraphQL, dove il client gestisce il fatto che lo schema viene chiamato con l’estensione GQLschema
. Ad esempio, l’esecuzione di una semplice richiesta GET
di /content/cq:graphql/global/endpoint.GQLschema
si tradurrà nell’output dello schema con il tipo di contenuto: text/x-graphql-schema;charset=iso-8859-1
.
Generazione schema: modelli non pubblicati
Quando i frammenti di contenuto sono nidificati, può accadere che venga pubblicato un modello di Frammento di contenuto principale, ma non il modello di riferimento.
In questo caso, AEM genera uno schema incompleto per il modello di Frammento di contenuto principale. Ciò significa che il Riferimento al frammento, che dipende dal modello non pubblicato, viene rimosso dallo schema.
Campi
Nello schema sono presenti singoli campi, di due categorie di base:
-
Campi generati dall’utente.
Per creare campi in base alla modalità di configurazione del modello di frammento di contenuto, viene utilizzata una selezione di Tipi di dati. I nomi dei campi vengono ricavati dal campo Nome proprietà della scheda Tipo di dati.
- C'è anche da tenere presente l’impostazione Rendering come, in quanto gli utenti possono configurare determinati tipi di dati. Ad esempio, è possibile configurare un campo di testo a riga singola per contenere più testi a riga singola scegliendo
multifield
dall'elenco a discesa.
- C'è anche da tenere presente l’impostazione Rendering come, in quanto gli utenti possono configurare determinati tipi di dati. Ad esempio, è possibile configurare un campo di testo a riga singola per contenere più testi a riga singola scegliendo
-
GraphQL per AEM genera anche diversi campi di supporto.
Tipi di dati
GraphQL per AEM supporta un elenco di tipi. Vengono rappresentati tutti i tipi di dati dei modelli di Frammento di contenuto supportati e i corrispondenti tipi GraphQL:
String
, [String]
String
, [String]
Float
, [Float]
Boolean
Calendar
onlyDate
, onlyTime
, dateTime
String
[String]
String
, [String]
String
, [String]
Campo singolo:
Model
- Tipo di modello, a cui si fa riferimento direttamenteMultifield, con un tipo a cui si fa riferimento:
[Model]
- Array di tipo Model
, a cui si fa riferimento direttamente dall'arrayMultifield, con più tipi a cui si fa riferimento:
[AllFragmentModels]
- Array di tutti i tipi di modello, a cui si fa riferimento dall'array con tipo di unioneCampo singolo:
Model
- Tipo di modello, a cui si fa riferimento direttamenteMultifield, con un tipo a cui si fa riferimento:
[Model]
- Array di tipo Model
, a cui si fa riferimento direttamente dall'arrayMultifield, con più tipi a cui si fa riferimento:
[AllFragmentModels]
- Array di tutti i tipi di modello, a cui si fa riferimento dall'array con tipo di unione