Découvrez comment utiliser GraphQL avec AEM pour diffuser du contenu en mode découplé en explorant des exemples de contenu et de requêtes.
Il est préférable de lire cette page à la lumière des sections suivantes :
Pour prendre en main les requêtes GraphQL et leur fonctionnement avec les fragments de contenu AEM, il peut être utile de consulter quelques exemples pratiques.
Pour obtenir de l’aide à ce sujet, voir les éléments suivants :
Un certain nombre d’exemples de requêtes GraphQL, basés sur l’exemple de structure de fragment de contenu (modèles de fragments de contenu et fragments de contenu associés).
Consultez ces exemples de requêtes pour obtenir un aperçu de la création de requêtes, ainsi que des exemples de résultats.
Selon votre instance, vous pouvez accéder directement à l’interface GraphiQL incluse avec l’API GraphQL d’AEM pour soumettre et tester des requêtes.
Vous pouvez accéder à l’éditeur de requêtes à partir de :
http://localhost:4502/aem/graphiql.html
Les exemples de requêtes sont basés sur l’exemple de structure de fragment de contenu à utiliser avec GraphQL
Tous les types
seront renvoyés pour tous les schémas disponibles.
Exemple de requête
{
__schema {
types {
name
description
}
}
}
Exemple de résultat
{
"data": {
"__schema": {
"types": [
{
"name": "AdventureModel",
"description": null
},
{
"name": "AdventureModelArrayFilter",
"description": null
},
{
"name": "AdventureModelFilter",
"description": null
},
{
"name": "AdventureModelResult",
"description": null
},
{
"name": "AdventureModelResults",
"description": null
},
{
"name": "AllFragmentModels",
"description": null
},
{
"name": "ArchiveRef",
"description": null
},
{
"name": "ArrayMode",
"description": null
},
{
"name": "ArticleModel",
"description": null
},
...more results...
{
"name": "__EnumValue",
"description": null
},
{
"name": "__Field",
"description": null
},
{
"name": "__InputValue",
"description": null
},
{
"name": "__Schema",
"description": "A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations."
},
{
"name": "__Type",
"description": null
},
{
"name": "__TypeKind",
"description": "An enum describing what kind of type a given __Type is"
}
]
}
}
}
Pour récupérer toutes les informations sur toutes les villes, vous pouvez utiliser la requête de base :
Exemple de requête
{
cityList {
items
}
}
Une fois l’exécution effectuée, le système développe automatiquement la requête pour inclure tous les champs :
{
cityList {
items {
_path
name
country
population
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"_path": "/content/dam/sample-content-fragments/cities/basel",
"name": "Basel",
"country": "Switzerland",
"population": 172258
},
{
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491
},
{
"_path": "/content/dam/sample-content-fragments/cities/bucharest",
"name": "Bucharest",
"country": "Romania",
"population": 1821000
},
{
"_path": "/content/dam/sample-content-fragments/cities/san-francisco",
"name": "San Francisco",
"country": "USA",
"population": 883306
},
{
"_path": "/content/dam/sample-content-fragments/cities/san-jose",
"name": "San Jose",
"country": "USA",
"population": 1026350
},
{
"_path": "/content/dam/sample-content-fragments/cities/stuttgart",
"name": "Stuttgart",
"country": "Germany",
"population": 634830
},
{
"_path": "/content/dam/sample-content-fragments/cities/zurich",
"name": "Zurich",
"country": "Switzerland",
"population": 415367
}
]
}
}
}
Il s’agit d’une requête simple pour renvoyer l’élément name
de toutes les entrées dans le schémacity
.
Exemple de requête
query {
cityList {
items {
name
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"name": "Basel"
},
{
"name": "Berlin"
},
{
"name": "Bucharest"
},
{
"name": "San Francisco"
},
{
"name": "San Jose"
},
{
"name": "Stuttgart"
},
{
"name": "Zurich"
}
]
}
}
}
Il s’agit d’une requête qui renvoie les détails d’une entrée de fragment unique vers un emplacement spécifique dans le référentiel.
Exemple de requête
{
cityByPath (_path: "/content/dam/sample-content-fragments/cities/berlin") {
item {
_path
name
country
population
categories
}
}
}
Exemples de résultats
{
"data": {
"cityByPath": {
"item": {
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491,
"categories": [
"city:capital",
"city:emea"
]
}
}
}
}
Si vous créez une nouvelle variante, appelée « Centre de Berlin » (berlin_centre
), pour Berlin en tant que city
, vous pouvez utiliser une requête afin de renvoyer des détails sur la variante.
Exemple de requête
{
cityList (variation: "berlin_center") {
items {
_path
name
country
population
categories
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491,
"categories": [
"city:capital",
"city:emea"
]
}
]
}
}
}
Grâce à la structure des fragments imbriqués, cette requête renvoie tous les détails relatifs au PDG d’une entreprise et à tous ses employés.
Exemple de requête
query {
companyList {
items {
name
ceo {
_path
name
firstName
awards {
id
title
}
}
employees {
name
firstName
awards {
id
title
}
}
}
}
}
Exemples de résultats
{
"data": {
"companyList": {
"items": [
{
"name": "Apple Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/steve-jobs",
"name": "Jobs",
"firstName": "Steve",
"awards": []
},
"employees": [
{
"name": "Marsh",
"firstName": "Duke",
"awards": []
},
{
"name": "Caulfield",
"firstName": "Max",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
}
]
}
]
},
{
"name": "Little Pony, Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/adam-smith",
"name": "Smith",
"firstName": "Adam",
"awards": []
},
"employees": [
{
"name": "Croft",
"firstName": "Lara",
"awards": [
{
"id": "GS",
"title": "Gamestar"
}
]
},
{
"name": "Slade",
"firstName": "Cutter",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
},
{
"id": "GS",
"title": "Gamestar"
}
]
}
]
},
{
"name": "NextStep Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/steve-jobs",
"name": "Jobs",
"firstName": "Steve",
"awards": []
},
"employees": [
{
"name": "Smith",
"firstName": "Joe",
"awards": []
},
{
"name": "Lincoln",
"firstName": "Abraham",
"awards": []
}
]
}
]
}
}
}
Elle filtre toutes les persons
qui portent le nom Jobs
ou Smith
.
Exemple de requête
query {
personList(filter: {
name: {
_logOp: OR
_expressions: [
{
value: "Jobs"
},
{
value: "Smith"
}
]
}
}) {
items {
name
firstName
}
}
}
Exemples de résultats
{
"data": {
"personList": {
"items": [
{
"name": "Smith",
"firstName": "Adam"
},
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Jobs",
"firstName": "Steve"
}
]
}
}
}
Elle filtre toutes les persons
qui portent le nom Jobs
ou Smith
.
Exemple de requête
query {
personList(filter: {
name: {
_expressions: [
{
value: "Jobs"
_operator: EQUALS_NOT
}
]
}
}) {
items {
name
firstName
}
}
}
Exemples de résultats
{
"data": {
"personList": {
"items": [
{
"name": "Lincoln",
"firstName": "Abraham"
},
{
"name": "Smith",
"firstName": "Adam"
},
{
"name": "Slade",
"firstName": "Cutter"
},
{
"name": "Marsh",
"firstName": "Duke"
},
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Croft",
"firstName": "Lara"
},
{
"name": "Caulfield",
"firstName": "Max"
}
]
}
}
}
_path
commence par un préfixe spécifiqueToutes les adventures
où _path
commence par un préfixe spécifique (/content/dam/wknd/en/adventures/cycling
).
Exemple de requête
query {
adventureList(
filter: {
_path: {
_expressions: [
{
value: "/content/dam/wknd/en/adventures/cycling"
_operator: STARTS_WITH
}]
}
})
{
items {
_path
}
}
}
Exemples de résultats
{
"data": {
"adventureList": {
"items": [
{
"_path": "/content/dam/wknd/en/adventures/cycling-southern-utah/cycling-southern-utah"
},
{
"_path": "/content/dam/wknd/en/adventures/cycling-tuscany/cycling-tuscany"
}
]
}
}
}
Ici, le filtrage concerne une combinaison de champs. Un opérateur AND
(implicite) est utilisé pour sélectionner la plage population
, tandis qu’un opérateur OR
(explicite) est utilisé pour sélectionner les villes requises.
Exemple de requête
query {
cityList(filter: {
population: {
_expressions: [
{
value: 400000
_operator: GREATER_EQUAL
}, {
value: 1000000
_operator: LOWER
}
]
},
country: {
_logOp: OR
_expressions: [
{
value: "Germany"
}, {
value: "Switzerland"
}
]
}
}) {
items {
name
population
country
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"name": "Stuttgart",
"population": 634830,
"country": "Germany"
},
{
"name": "Zurich",
"population": 415367,
"country": "Switzerland"
}
]
}
}
}
Cette requête interroge toutes les villes dont le nom contient SAN
, indépendamment de la casse.
Exemple de requête
query {
cityList(filter: {
name: {
_expressions: [
{
value: "SAN"
_operator: CONTAINS
_ignoreCase: true
}
]
}
}) {
items {
name
population
country
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA"
},
{
"name": "San Jose",
"population": 1026350,
"country": "USA"
}
]
}
}
}
Cette requête effectue un filtrage sur un tableau avec un élément (city:na
) qui doit se produire au moins une fois.
Exemple de requête
query {
cityList(filter: {
categories: {
_expressions: [
{
value: "city:na"
_apply: AT_LEAST_ONCE
}
]
}
}) {
items {
name
population
country
categories
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA",
"categories": [
"city:beach",
"city:na"
]
},
{
"name": "San Jose",
"population": 1026350,
"country": "USA",
"categories": [
"city:na"
]
}
]
}
}
}
Cette requête effectue un filtrage sur une valeur de tableau exacte.
Exemple de requête
query {
cityList(filter: {
categories: {
_expressions: [
{
values: [
"city:beach",
"city:na"
]
}
]
}
}) {
items {
name
population
country
categories
}
}
}
Exemples de résultats
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA",
"categories": [
"city:beach",
"city:na"
]
}
]
}
}
}
Cette requête illustre le filtrage pour toute person
portant le name
« Smith », qui renvoie des informations provenant de deux fragments imbriqués – company
et employee
.
Exemple de requête
query {
companyList(filter: {
employees: {
_match: {
name: {
_expressions: [
{
value: "Smith"
}
]
}
}
}
}) {
items {
name
ceo {
name
firstName
}
employees {
name
firstName
}
}
}
}
Exemples de résultats
{
"data": {
"companyList": {
"items": [
{
"name": "NextStep Inc.",
"ceo": {
"name": "Jobs",
"firstName": "Steve"
},
"employees": [
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Lincoln",
"firstName": "Abraham"
}
]
}
]
}
}
}
Cette requête illustre le filtrage de trois fragments imbriqués : company
, employee
et award
.
Exemple de requête
query {
companyList(filter: {
employees: {
_apply: ALL
_match: {
awards: {
_match: {
id: {
_expressions: [
{
value: "GS"
_operator:EQUALS
}
]
}
}
}
}
}
}) {
items {
name
ceo {
name
firstName
}
employees {
name
firstName
awards {
id
title
}
}
}
}
}
Exemples de résultats
{
"data": {
"companyList": {
"items": [
{
"name": "Little Pony, Inc.",
"ceo": {
"name": "Smith",
"firstName": "Adam"
},
"employees": [
{
"name": "Croft",
"firstName": "Lara",
"awards": [
{
"id": "GS",
"title": "Gamestar"
}
]
},
{
"name": "Slade",
"firstName": "Cutter",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
},
{
"id": "GS",
"title": "Gamestar"
}
]
}
]
}
]
}
}
}
Cette requête illustre le filtrage de trois fragments imbriqués : company
, employee
et award
.
Exemple de requête
query {
awardList(filter: {
id: {
_expressions: [
{
value:"GB"
}
]
}
}) {
items {
_metadata {
stringMetadata {
name,
value
}
}
id
title
}
}
}
Exemples de résultats
{
"data": {
"awardList": {
"items": [
{
"_metadata": {
"stringMetadata": [
{
"name": "title",
"value": "Gameblitz Award"
},
{
"name": "description",
"value": ""
}
]
},
"id": "GB",
"title": "Gameblitz"
}
]
}
}
}
Ces exemples de requêtes sont basés sur le projet WKND. Il s’agit des éléments suivants :
Modèles de fragments de contenu disponibles sous :
http://<hostname>:<port>/libs/dam/cfm/models/console/content/models.html/conf/wknd
Fragments de contenu (et autres contenus) disponibles sous :
http://<hostname>:<port>/assets.html/content/dam/wknd/en
http://<hostname>:<port>/assets.html/content/dam/wknd-shared/en
Les résultats pouvant être volumineux, ils ne sont pas reproduits ici.
Cet exemple de requête interroge :
article
;_path
et les propriétés du authorFragment
.Exemple de requête
{
articleList {
items {
_path
authorFragment {
_path
firstName
lastName
birthDay
}
}
}
}
Cette requête interroge :
adventure
;Exemple de requête
{
adventureList {
items {
_path,
_metadata {
stringMetadata {
name,
value
}
stringArrayMetadata {
name,
value
}
intMetadata {
name,
value
}
intArrayMetadata {
name,
value
}
floatMetadata {
name,
value
}
floatArrayMetadata {
name,
value
}
booleanMetadata {
name,
value
}
booleanArrayMetadata {
name,
value
}
calendarMetadata {
name,
value
}
calendarArrayMetadata {
name,
value
}
}
}
}
}
Cet exemple de requête interroge :
article
avec un chemin spécifique ;
Exemple de requête
{
articleByPath(_path: "/content/dam/wknd-shared/en/magazine/alaska-adventure/alaskan-adventures") {
item {
_path
authorFragment {
_path
firstName
lastName
birthDay
}
main {
html
markdown
plaintext
json
}
}
}
}
Cet exemple de requête interroge :
Exemple de requête
{
adventureByPath(_path: "/content/dam/wknd-shared/en/magazine/western-australia/western-australia-by-camper-van") {
item {
_path
title
_model {
_path
title
}
}
}
}
Cette requête interroge :
article
avec un chemin spécifique ;
Le champ referencearticle
a le type de données fragment-reference
.
Exemple de requête
{
adventureByPath(_path: "/content/dam/wknd-shared/en/magazine/western-australia/western-australia-by-camper-van") {
item {
_path
title
_model {
_path
title
}
}
}
}
Cette requête interroge :
bookmark
;
article
et adventure
.Le champ fragments
présente le type de données fragment-reference
, avec les modèles Article
, Adventure
sélectionnés.
{
bookmarkList {
items {
fragments {
... on ArticleModel {
_path
author
}
... on AdventureModel {
_path
adventureTitle
}
}
}
}
}
Cette requête possède deux versions :
attachments
Ces requêtes interrogent :
bookmark
;
La requête suivante renvoie toutes les références de contenu en utilisant _references
:
{
bookmarkList {
_references {
... on ImageRef {
_path
type
height
}
... on MultimediaRef {
_path
type
size
}
... on DocumentRef {
_path
type
author
}
... on ArchiveRef {
_path
type
format
}
}
items {
_path
}
}
}
La requête suivante renvoie tous les attachments
– un champ spécifique (sous-groupe) de type content-reference
:
Le champ attachments
présente le type de données content-reference
, avec différents formulaires sélectionnés.
{
bookmarkList {
items {
attachments {
... on PageRef {
_path
type
}
... on ImageRef {
_path
width
}
... on MultimediaRef {
_path
size
}
... on DocumentRef {
_path
author
}
... on ArchiveRef {
_path
format
}
}
}
}
}
Cette requête interroge :
bookmark
avec un chemin spécifique ;
Les références en ligne RTE sont alimentées dans _references
.
Exemple de requête
{
bookmarkByPath(_path: "/content/dam/wknd/en/bookmarks/skitouring") {
item {
_path
description {
json
}
}
_references {
... on ArticleModel {
_path
}
... on AdventureModel {
_path
}
... on ImageRef {
_path
}
... on MultimediaRef {
_path
}
... on DocumentRef {
_path
}
... on ArchiveRef {
_path
}
}
}
}
Cette requête interroge :
author
avec un chemin spécifique ;
another
.Exemple de requête
{
authorByPath(_path: "/content/dam/wknd-shared/en/contributors/ian-provo", variation: "another") {
item {
_path
_variation
firstName
lastName
birthDay
}
}
}
Cette requête interroge :
author
avec une variation spécifique : another
Cela permet d’afficher la version de secours pour les fragments de contenu qui n’ont pas de Variation du nom spécifié.
Exemple de requête
{
authorList(variation: "another") {
items {
_path
_variation
firstName
lastName
birthDay
}
}
}
Cette requête interroge :
article
dans le paramètre régional fr
Exemple de requête
{
articleList(_locale: "fr") {
items {
_path
authorFragment {
_path
firstName
lastName
birthDay
}
main {
html
markdown
plaintext
json
}
}
}
}
Cette requête interroge :
Exemple de requête
{
articleList(offset: 5, limit: 5) {
items {
authorFragment {
_path
firstName
lastName
birthDay
}
_path
}
}
}
Cette requête interroge :
Exemple de requête
{
adventurePaginated(first: 5, after: "ODg1MmMyMmEtZTAzMy00MTNjLThiMzMtZGQyMzY5ZTNjN2M1") {
edges {
cursor
node {
title
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
Les exemples de requêtes sont basés sur la structure suivante, qui utilise :
Un ou plusieurs exemples de modèles de fragments de contenu constituent la base des schémas GraphQL
Exemples de fragments de contenu basés sur les modèles ci-dessus
Pour les exemples de requêtes, nous utiliserons les modèles de contenu suivants et leurs relations mutuelles (références ->) :
Entreprise
-> Personne
-> Distinction
Les champs de base définissant l’entreprise sont les suivants :
Nom du champ | Type de données | Référence |
---|---|---|
Nom de l’entreprise | Une seule ligne de texte | |
PDG | Référence du fragment (unique) | Personne |
Employés | Référence du fragment (champ multiple) | Personne |
Champs définissant une personne, qui peut également être un employé :
Nom du champ | Type de données | Référence |
---|---|---|
Nom | Une seule ligne de texte | |
Prénom | Une seule ligne de texte | |
Distinctions | Référence du fragment (champ multiple) | Distinction |
Les champs définissant une distinction sont les suivants :
Nom du champ | Type de données | Référence |
---|---|---|
Raccourci/ID | Une seule ligne de texte | |
Titre | Une seule ligne de texte |
Les champs permettant de définir une ville sont les suivants :
Nom du champ | Type de données | Référence |
---|---|---|
Nom | Une seule ligne de texte | |
Pays | Une seule ligne de texte | |
Population | Nombre | |
Catégories | Balises |
Les fragments suivants sont utilisés pour le modèle approprié.
Nom de l’entreprise | PDG | Employés |
---|---|---|
Apple | Steve Jobs | Duke Marsh Max Caulfield |
Little Pony Inc. | Adam Smith | Lara Croft Cutter Slade |
NextStep Inc. | Steve Jobs | Joe Smith Abe Lincoln |
Nom | Prénom | Distinctions |
---|---|---|
Lincoln | Abe | |
Smith | Adam | |
Slade | Cutter | Gameblitz Gamestar |
Marsh | Duke | |
Smith | Joe | |
Croft | Lara | Gamestar |
Caulfield | Max | Gameblitz |
Jobs | Steve |
Raccourci/ID | Titre |
---|---|
GB | Gameblitz |
GS | Gamestar |
OSC | Oscar |
Nom | Pays | Population | Catégories |
---|---|---|---|
Bâle | Suisse | 172258 | city:emea |
Berlin | Allemagne | 3669491 | city:capital city:emea |
Bucarest | Roumanie | 1821000 | city:capital city:emea |
San Francisco | États-Unis | 883306 | city:beach city:na |
San Jose | États-Unis | 102635 | city:na |
Stuttgart | Allemagne | 634830 | city:emea |
Zurich | Suisse | 415367 | city:capital city:emea |