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:

  • Query

  • Schemi e tipi:

    • 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.
  • Campi

  • Endpoint GraphQL

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:

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
NOTE
Di solito non esiste un dispatcher/CDN sull’autore, quindi in quel caso non c’è alcun vantaggio nell’utilizzo di query persistenti; oltre ai test.

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.

NOTE
Per consentire query dirette e/o POST in Dispatcher, puoi chiedere all’amministratore di sistema di:
NOTE
In futuro, la capacità di eseguire query dirette potrebbe diventare obsoleta.

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)
  • 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.

CAUTION
Tutti gli schemi GraphQL (derivati dai modelli di Frammenti di contenuto che sono stati abilitati) sono leggibili attraverso l’endpoint GraphQL.
Ciò significa che devi assicurarti che non siano disponibili dati sensibili, che in questo modo potrebbero trapelare; ad esempio, informazioni che potrebbero essere presenti come nomi di campo nella definizione del modello.

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.

  1. Modello di Frammento di contenuto:

    Modello di Frammento di contenuto da utilizzare con GraphQL

  2. Lo schema GraphQL corrispondente (output dalla documentazione automatica GraphiQL):
    Schema GraphQL basato su modello di Frammento di contenuto

    Questo mostra che il tipo ArticleModel generato contiene diversi campi.

    • Tre di essi sono stati controllati dall’utente: author, main e referencearticle.

    • 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.

  3. 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:

  1. Installi un pacchetto contenente Content-Fragment-Model-1 e Content-Fragment-Model-2:

    1. sono generati tipi di GraphQL per Model-1 e Model-2.
  2. Poi modifica Content-Fragment-Model-2:

    1. verrà aggiornato solo il tipo GraphQL Model-2.

    2. mentre Model-1 rimarrà lo stesso.

NOTE
Questo è importante da notare nel caso in cui desideri eseguire aggiornamenti in blocco sui modelli di Frammento di contenuto tramite l’API REST o in altro modo.

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.

NOTE
L’interfaccia utente AEM impedisce che ciò accada, ma se la pubblicazione viene effettuata a livello di programmazione o con pacchetti di contenuto può verificarsi.

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.
  • 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:

Modello di Frammento di contenuto: tipo di dati
Tipo GraphQL
Descrizione
Testo su riga singola
String, [String]
Utilizzato per stringhe semplici come nomi di autore, nomi di posizione e così via.
Testo su più righe
String, [String]
Utilizzato per l’output di testo, ad esempio il corpo di un articolo
Numero
Float, [Float]
Utilizzato per visualizzare il numero a virgola mobile e i numeri regolari
Booleano
Boolean
Utilizzato per visualizzare le caselle di controllo → semplici istruzioni true/false
Data e ora
Calendar
Utilizzato per visualizzare la data e l’ora in formato ISO 8601. A seconda del tipo selezionato, sono disponibili tre versioni da utilizzare in AEM GraphQL: onlyDate, onlyTime, dateTime
Enumerazione
String
Utilizzato per visualizzare un’opzione da un elenco di opzioni definito durante la creazione del modello
Tag
[String]
Utilizzato per visualizzare un elenco di stringhe che rappresentano tag utilizzati in AEM
Riferimento contenuto
String, [String]
Utilizzato per visualizzare il percorso per un’altra risorsa in AEM
Riferimento contenuto (UUID)
String, [String]
Utilizzato per visualizzare il percorso, rappresentato da un UUID, verso un’altra risorsa in AEM
Riferimento frammento
Un tipo di modello

Campo singolo: Model - Tipo di modello, a cui si fa riferimento direttamente

Multifield, con un tipo a cui si fa riferimento: [Model] - Array di tipo Model, a cui si fa riferimento direttamente dall'array

Multifield, 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
Utilizzato per fare riferimento a uno o più frammenti di contenuto di alcuni tipi di modelli, definiti al momento della creazione del modello
Riferimento frammento (UUID)
Un tipo di modello

Campo singolo: Model - Tipo di modello, a cui si fa riferimento direttamente

Multifield, con un tipo a cui si fa riferimento: [Model] - Array di tipo Model, a cui si fa riferimento direttamente dall'array

Multifield, 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
Utilizzato per fare riferimento a uno o più frammenti di contenuto di alcuni tipi di modelli, definiti al momento della creazione del modello