Lär dig hur du använder innehållsfragment i Adobe Experience Manager (AEM) as a Cloud Service med AEM GraphQL API för leverans av headless-innehåll.
AEM as a Cloud Service GraphQL-API som används med innehållsfragment är till stor del baserat på GraphQL-API:t med öppen källkod.
Genom att använda GraphQL API i AEM kan du effektivt leverera innehållsfragment till JavaScript-klienter i headless CMS-implementeringar:
GraphQL används för närvarande i två (separata) scenarier i Adobe Experience Manager (AEM) as a Cloud Service:
GraphQL är:
"…ett frågespråk för API:er och en körningsmiljö för att utföra dessa frågor med dina befintliga data. GraphQL ger en fullständig och begriplig beskrivning av data i API:t, ger kunderna möjlighet att fråga efter exakt vad de behöver och ingenting mer, gör det enklare att utveckla API:er över tid och möjliggör kraftfulla utvecklingsverktyg.".
Se GraphQL.org
"…en öppen specifikation för ett flexibelt API-lager. Placera GraphQL över era befintliga bakgrunder för att skapa produkter snabbare än någonsin …".
Se Utforska GraphQL.
"…ett datameddelande och en specifikation som utvecklats internt av Facebook 2012 innan de blev offentligt tillgängliga 2015. Det är ett alternativ till REST-baserade arkitekturer i syfte att öka utvecklarnas produktivitet och minimera mängden data som överförs. GraphQL används i produktionen av hundratals organisationer av alla storlekar…"
Mer information om GraphQL API finns i följande avsnitt (bland annat på engelska):
At graphql.org:
At graphql.com:
Implementeringen av GraphQL för AEM baseras på GraphQL Java Library. Se:
GraphQL använder följande:
Sökvägen i AEM som svarar på GraphQL-frågor och ger åtkomst till GraphQL-scheman.
Se Aktivera din GraphQL-slutpunkt för mer information.
Se (GraphQL.org) Introduktion till GraphQL för utförlig information, inklusive Bästa praxis.
Med GraphQL kan du utföra frågor för att returnera:
A enkel inmatning
AEM innehåller funktioner för att konvertera frågor (båda typerna) till Beständiga frågor som kan cachas av Dispatcher och CDN.
The Beständiga frågor är den rekommenderade metod som ska användas för publiceringsinstanser som:
Vanligtvis finns det ingen dispatcher/CDN på författaren, så det är ingen fördel att använda beständiga frågor där. förutom att testa dem.
GraphQL-frågor som använder förfrågningar om POST rekommenderas inte eftersom de inte cachelagras, så i en standardinstans är Dispatcher konfigurerad att blockera sådana frågor.
Även om GraphQL har stöd för GET-förfrågningar kan dessa få träffgränser (till exempel längden på URL:en) som kan undvikas med beständiga frågor.
Om du vill tillåta direkta och/eller POST frågor i Dispatcher kan du be systemadministratören att:
ENABLE_GRAPHQL_ENDPOINT
true
Möjligheten att utföra direkta frågor kan vara föråldrad vid något tillfälle i framtiden.
Du kan testa och felsöka GraphQL-frågor med GraphiQL IDE.
Användningsexemplen kan bero på vilken typ av AEM as a Cloud Service miljö det är:
Publiceringsmiljö. används för att:
Författarmiljö; används för att:
Behörigheterna är de som krävs för åtkomst av resurser.
GraphQL-frågor körs med tillstånd från den AEM användaren av den underliggande begäran. Om användaren inte har läsåtkomst till vissa fragment (som lagras som resurser) blir de inte en del av resultatuppsättningen.
Dessutom måste användaren ha åtkomst till en GraphQL-slutpunkt för att kunna köra GraphQL-frågor.
GraphQL är ett starkt typbestämt API, vilket innebär att data måste vara tydligt strukturerade och ordnade efter typ.
GraphQL-specifikationen innehåller en serie riktlinjer för hur du skapar ett robust API för att förhöra data i en viss instans. För att göra detta måste en kund hämta Schema, som innehåller alla typer som behövs för en fråga.
För innehållsfragment baseras GraphQL-scheman (struktur och typer) på Aktiverad Modeller för innehållsfragment och deras datatyper.
Alla GraphQL-scheman (härledda från Content Fragment Models som har Aktiverad) går att läsa via GraphQL-slutpunkten.
Detta innebär att ni måste se till att inga känsliga uppgifter finns tillgängliga, eftersom de skulle kunna läckas på detta sätt. Detta inkluderar till exempel information som kan finnas som fältnamn i modelldefinitionen.
Om en användare till exempel har skapat en innehållsfragmentmodell som kallas Article
AEM sedan generera en GraphQL-typ ArticleModel
. Fälten i den här typen motsvarar fälten och datatyperna som definieras i modellen. Dessutom skapas vissa startpunkter för frågor som arbetar med den här typen, till exempel articleByPath
eller articleList
.
En innehållsfragmentmodell:
Motsvarande GraphQL-schema (utdata från den automatiska dokumentationen för GraphiQL):
Detta visar att den genererade typen ArticleModel
innehåller flera fält.
Tre av dem har kontrollerats av användaren: author
, main
och referencearticle
.
De andra fälten lades till automatiskt av AEM och representerar användbara metoder för att tillhandahålla information om ett visst innehållsfragment. i det här exemplet hjälpfält) _path
, _metadata
, _variations
.
När en användare har skapat ett innehållsfragment baserat på artikelmodellen kan det sedan förhöras via GraphQL. Mer information finns i Exempelfrågor (baserat på exempelstruktur för innehållsfragment för användning med GraphQL).
I GraphQL for AEM är schemat flexibelt. Det innebär att den genereras automatiskt varje gång en innehållsfragmentmodell skapas, uppdateras eller tas bort. Cacheminnen för dataschemat uppdateras också när du uppdaterar en innehållsfragmentmodell.
Cacheminnen för dataschemat uppdateras också när du uppdaterar en innehållsfragmentmodell.
Tjänsten Sites GraphQL avlyssnar (i bakgrunden) alla ändringar som görs i en innehållsfragmentmodell. När uppdateringar upptäcks återskapas endast den delen av schemat. Denna optimering sparar tid och ger stabilitet.
Om du till exempel:
Installera ett paket som innehåller Content-Fragment-Model-1
och Content-Fragment-Model-2
:
Model-1
och Model-2
kommer att genereras.Ändra sedan Content-Fragment-Model-2
:
Endast Model-2
GraphQL Type kommer att uppdateras.
med beaktande av följande: Model-1
kommer att förbli desamma.
Detta är viktigt att notera om du vill göra satsvisa uppdateringar på modeller för innehållsfragment via REST-API:t, eller på annat sätt.
Schemat hanteras via samma slutpunkt som GraphQL-frågorna, där klienthanteraren hanterar det faktum att schemat anropas med tillägget GQLschema
. Du kan till exempel utföra en enkel GET
begäran på /content/cq:graphql/global/endpoint.GQLschema
resulterar i utdata från schemat med innehållstypen: text/x-graphql-schema;charset=iso-8859-1
.
När innehållsfragment är kapslade kan det hända att en överordnad Content Fragment Model publiceras, men ingen refererad modell gör det.
Gränssnittet AEM förhindrar detta, men om publiceringen görs programmatiskt eller med innehållspaket kan det ske.
När detta inträffar genererar AEM en ofullständig Schema för den överordnade innehållsfragmentmodellen. Det innebär att fragmentreferensen, som är beroende av den opublicerade modellen, tas bort från schemat.
Inom schemat finns det enskilda fält av två baskategorier:
Fält som du genererar.
Ett urval av Datatyper används för att skapa fält baserat på hur du konfigurerar innehållsfragmentmodellen. Fältnamnen hämtas från Egenskapsnamn fält för Datatyp -fliken.
multifield
i listrutan.GraphQL for AEM genererar också ett antal hjälpfält.
GraphQL för AEM har stöd för en lista med typer. Alla Content Fragment Model-datatyper som stöds och motsvarande GraphQL-typer visas:
Content Fragment Model - datatyp | GraphQL Type | Beskrivning |
---|---|---|
Enkelradig text | String , [String] |
Används för enkla strängar som författarnamn, platsnamn osv. |
Flerradstext | String , [String] |
Används för att skriva ut text, t.ex. brödtexten i en artikel |
Siffra | Float , [Float] |
Används för att visa flyttal och reguljära tal |
Boolean | Boolean |
Används för att visa kryssrutor → enkla sant/falskt-satser |
Datum och tid | Calendar |
Används för att visa datum och tid i ett ISO 8601-format. Beroende på vilken typ som valts finns det tre aromer som kan användas i AEM GraphQL: onlyDate , onlyTime , dateTime |
Uppräkning | String |
Används för att visa ett alternativ från en lista med alternativ som definieras när modellen skapas |
Taggar | [String] |
Används för att visa en lista över strängar som representerar taggar som används i AEM |
Innehållsreferens | String , [String] |
Används för att visa sökvägen till en annan resurs i AEM |
Fragmentreferens | En modelltyp Ett fält: Model - Modelltyp, refereras direkt Multifält, med en referenstyp: [Model] - Array av typen Model , som refereras direkt från en array Multifält, med flera refererade typer: [AllFragmentModels] - Array med alla modelltyper, refererad från array med unionstyp |
Används för att referera till en eller flera innehållsfragment av vissa modelltyper, som definieras när modellen skapades |
Förutom datatyperna för användargenererade fält genererar GraphQL för AEM även ett antal hjälpare fält för att hjälpa till att identifiera ett innehållsfragment eller för att ge ytterligare information om ett innehållsfragment.
Dessa hjälpfält markeras med föregående _
för att skilja mellan vad som har definierats av användaren och vad som har genererats automatiskt.
Sökvägsfältet används som en identifierare i AEM GraphQL. Den representerar sökvägen till Content Fragment-resursen i AEM. Vi har valt detta som identifierare för ett innehållsfragment eftersom det:
I följande kod visas sökvägarna för alla innehållsfragment som har skapats baserat på modellen för innehållsfragment Author
, enligt självstudiekursen för WKND.
{
authorList {
items {
_path
}
}
}
Om du vill hämta ett enstaka innehållsfragment av en viss typ måste du också bestämma sökvägen först. Till exempel:
{
authorByPath(_path: "/content/dam/wknd-shared/en/contributors/sofia-sj-berg") {
item {
_path
firstName
lastName
}
}
}
Se Exempelfråga - Ett enskilt specifikt stadsfragment.
Via GraphQL visar AEM också metadata för ett innehållsfragment. Metadata är den information som beskriver ett innehållsfragment, till exempel titeln på ett innehållsfragment, miniatyrsökvägen, beskrivningen av ett innehållsfragment och datumet då det skapades, bland annat.
Eftersom metadata genereras via Schemaredigeraren och därför inte har någon särskild struktur, har TypedMetaData
GraphQL-typ implementerades för att visa metadata för ett innehållsfragment. TypedMetaData
visar informationen som grupperats med följande skalära typer:
Fält |
---|
stringMetadata:[StringMetadata]! |
stringArrayMetadata:[StringArrayMetadata]! |
intMetadata:[IntMetadata]! |
intArrayMetadata:[IntArrayMetadata]! |
floatMetadata:[FloatMetadata]! |
floatArrayMetadata:[FloatArrayMetadata]! |
booleanMetadata:[BooleanMetadata]! |
booleanArrayMetadata:[booleanArrayMetadata]! |
calendarMetadata:[CalendarMetadata]! |
calendarArrayMetadata:[CalendarArrayMetadata]! |
Varje skalär typ representerar antingen ett namn/värde-par eller en array med namn/värde-par, där värdet för det paret är av den typ som det grupperades i.
Om du till exempel vill hämta titeln för ett innehållsfragment vet vi att den här egenskapen är en String-egenskap, så vi frågar efter alla strängmetadata:
Så här frågar du efter metadata:
{
authorByPath(_path: "/content/dam/wknd-shared/en/contributors/sofia-sj-berg") {
item {
_metadata {
stringMetadata {
name
value
}
}
}
}
}
Du kan visa alla metadata för GraphQL-typer om du visar det genererade GraphQL-schemat. Alla modelltyper har samma TypedMetaData
.
Skillnad mellan normala metadata och arraymetadata
Kom ihåg att StringMetadata
och StringArrayMetadata
båda hänvisar till vad som lagras i databasen, inte till hur du hämtar dem.
Genom att anropa stringMetadata
får du en array med alla metadata som lagras i databasen som String
och om du ringer stringArrayMetadata
får du en array med alla metadata som lagras i databasen som String[]
.
Se Exempelfråga för metadata - Ange metadata för utmärkelserna med namnet GB.
The _variations
-fältet har implementerats för att förenkla frågor om variationer som ett innehållsfragment har. Till exempel:
{
authorByPath(_path: "/content/dam/wknd-shared/en/contributors/ian-provo") {
item {
_variations
}
}
}
Observera att _variations
fältet innehåller inte master
variation, som tekniskt sett originaldata (refereras som Överordnad i användargränssnittet) inte betraktas som en explicit variation.
Se Exempelfråga - Alla städer med en namngiven variant.
Om den angivna varianten inte finns för ett innehållsfragment returneras originaldata (som också kallas för den överordnad variationen) som standard (fallback).
GraphQL tillåter att variabler placeras i frågan. Mer information finns i GraphQL-dokumentation för variabler.
Om du till exempel vill hämta alla innehållsfragment av typen Author
i en viss variant (om den är tillgänglig) kan du ange argumentet variation
i GraphiQL.
Fråga:
query($variation: String!) {
authorList(variation: $variation) {
items {
_variation
lastName
firstName
}
}
}
Frågevariabler:
{
"variation": "another"
}
Frågan returnerar den fullständiga listan med författare. Författare utan another
återgår till originaldata (_variation
kommer att rapportera master
i detta fall).
Om du vill begränsa listan till författare som anger den angivna varianten (och hoppa över författare som skulle återgå till originaldata) måste du använda en filter:
query($variation: String!) {
authorList(variation: $variation, filter: {
_variation: {
_expressions: {
value: $variation
}
}
}) {
items {
_variation
lastName
firstName
}
}
}
I GraphQL finns en möjlighet att ändra frågan baserat på variabler, så kallade GraphQL-direktiv.
Du kan till exempel inkludera adventurePrice
fält i en fråga för alla AdventureModels
, baserat på en variabel includePrice
.
Fråga:
query GetAdventureByType($includePrice: Boolean!) {
adventureList {
items {
title
price @include(if: $includePrice)
}
}
}
Frågevariabler:
{
"includePrice": true
}
Du kan också använda filtrering i dina GraphQL-frågor för att returnera specifika data.
Vid filtrering används en syntax som baseras på logiska operatorer och uttryck.
Den mest atomiska delen är ett enstaka uttryck som kan tillämpas på innehållet i ett visst fält. Innehållet i fältet jämförs med ett givet konstantvärde.
Uttrycket
{
value: "some text"
_op: EQUALS
}
skulle jämföra innehållet i fältet med värdet some text
och lyckas om innehållet är lika med värdet. Annars misslyckas uttrycket.
Följande operatorer kan användas för att jämföra fält med ett visst värde:
Operator | Typ(er) | Uttrycket lyckas om … |
---|---|---|
EQUALS |
String , ID , Boolean |
… värdet är exakt detsamma som fältets innehåll |
EQUALS_NOT |
String , ID |
… värdet är not samma som fältets innehåll |
CONTAINS |
String |
… innehållet i fältet innehåller värdet ({ value: "mas", _op: CONTAINS } matchar Christmas , Xmas , master , …) |
CONTAINS_NOT |
String |
… fältets innehåll not innehåller värdet |
STARTS_WITH |
ID |
… ID:t börjar med ett visst värde ({ value: "/content/dam/", _op: STARTS_WITH matchar /content/dam/path/to/fragment , men inte /namespace/content/dam/something |
EQUAL |
Int , Float |
… värdet är exakt detsamma som fältets innehåll |
UNEQUAL |
Int , Float |
… värdet är not samma som fältets innehåll |
GREATER |
Int , Float |
… innehållet i fältet är större än värdet |
GREATER_EQUAL |
Int , Float |
… innehållet i fältet är större än eller lika med värdet |
LOWER |
Int , Float |
… innehållet i fältet är lägre än värdet |
LOWER_EQUAL |
Int , Float |
… innehållet i fältet är mindre än eller lika med värdet |
AT |
Calendar , Date , Time |
… innehållet i fältet är exakt detsamma som värdet (inklusive tidszonsinställning) |
NOT_AT |
Calendar , Date , Time |
… innehållet i fältet är not samma som värdet |
BEFORE |
Calendar , Date , Time |
… den tidpunkt som anges av värdet är före den tidpunkt som anges av fältets innehåll |
AT_OR_BEFORE |
Calendar , Date , Time |
… den tidpunkt som anges av värdet är före eller vid samma tidpunkt som anges av fältets innehåll |
AFTER |
Calendar , Date , Time |
… den tidpunkt som anges av värdet är efter den tidpunkt som anges av fältets innehåll |
AT_OR_AFTER |
Calendar , Date , Time |
… den tidpunkt som anges av värdet är efter eller vid samma tidpunkt som anges av fältets innehåll |
I vissa typer kan du även ange ytterligare alternativ som ändrar hur ett uttryck utvärderas:
Alternativ | Typ(er) | Beskrivning |
---|---|---|
_ignoreCase |
String |
Ignorerar skiftläget för en sträng, t.ex. värdet time matchar TIME , time , tImE , … |
_sensitiveness |
Float |
Tillåter en viss marginal för float värden som ska anses vara desamma (för att kringgå tekniska begränsningar på grund av den interna representationen av float Värden. bör undvikas eftersom detta alternativ kan ha en negativ inverkan på prestandan |
Uttryck kan kombineras till en uppsättning med hjälp av en logisk operator (_logOp
):
OR
- uttrycksuppsättningen lyckas om minst ett uttryck lyckasAND
- uttrycksuppsättningen lyckas om alla uttryck lyckas (standard)Varje fält kan filtreras med en egen uppsättning uttryck. Uttrycksuppsättningarna för alla fält som omnämns i filterargumentet kombineras till slut av den egna logiska operatorn.
En filterdefinition (skickas som filter
argument till en fråga) innehåller:
lastName
i filtret för lastName
i fältet Data (fälttyp)_expressions
-array som innehåller uttrycksuppsättningen och _logOp
fält som definierar den logiska operatorn ska uttrycken kombineras medvalue
fält) och operatorn (_operator
fält) innehållet i ett fält ska jämföras medObservera att du kan utesluta _logOp
om du vill kombinera objekt med AND
och _operator
om du vill kontrollera likhet, eftersom det här är standardvärdena.
I följande exempel visas en fullständig fråga som filtrerar alla personer som har en lastName
av Provo
eller innehåller sjö
, oberoende av omständigheterna:
{
authorList(filter: {
lastname: {
_logOp: OR
_expressions: [
{
value: "sjö",
_operator: CONTAINS,
_ignoreCase: true
},
{
value: "Provo"
}
]
}
}) {
items {
lastName
firstName
}
}
}
Du kan även filtrera efter kapslade fält, men det rekommenderas inte eftersom det kan leda till prestandaproblem.
Ytterligare exempel finns i:
information om GraphQL för AEM tillägg
Exempelfrågor med detta exempelinnehåll och -struktur
För bästa prestanda bör du tänka på Uppdatera dina innehållsfragment för sidindelning och sortering i GraphQL-filtrering.
Med den här funktionen kan du sortera frågeresultaten efter ett angivet fält.
Sorteringskriterierna:
Till exempel:
query {
authorList(sort: "lastName, firstName") {
items {
firstName
lastName
}
}
}
Och dessutom:
{
authorList(sort: "lastName DESC, firstName DESC") {
items {
lastName
firstName
}
}
}
Du kan även sortera ett fält i ett kapslat fragment med formatet nestedFragmentname.fieldname
.
Detta kan ha en negativ inverkan på prestandan.
Till exempel:
query {
articleList(sort: "authorFragment.lastName") {
items {
title
authorFragment {
firstName
lastName
birthDay
}
slug
}
}
}
För bästa prestanda bör du tänka på Uppdatera dina innehållsfragment för sidindelning och sortering i GraphQL-filtrering.
Med den här funktionen kan du utföra sidindelning på frågetyper som returnerar en lista. Det finns två metoder:
offset
och limit
i en List
frågafirst
och after
i en Paginated
frågaI en ...List
fråga som du kan använda offset
och limit
om du vill returnera en viss delmängd av resultaten:
offset
: Anger den första datauppsättningen som ska returneraslimit
: Anger det maximala antalet datauppsättningar som ska returnerasOm du till exempel vill visa en resultatsida som innehåller upp till fem artiklar, med början från den femte artikeln från complete resultatlista:
query {
articleList(offset: 5, limit: 5) {
items {
authorFragment {
lastName
firstName
}
}
}
}
Sidindelning kräver en stabil sorteringsordning för att fungera korrekt i flera frågor som begär olika sidor i samma resultatuppsättning. Som standard används databassökvägen för varje objekt i resultatuppsättningen för att säkerställa att ordningen alltid är densamma. Om en annan sorteringsordning används, och om sorteringen inte kan göras på JCR-frågenivå, kommer det att få en negativ prestandapåverkan eftersom hela resultatuppsättningen måste läsas in i minnet innan sidorna kan bestämmas.
Ju högre förskjutning, desto längre tid tar det att hoppa över objekten från den fullständiga JCR-frågeresultatuppsättningen. En alternativ lösning för stora resultatuppsättningar är att använda den numrerade frågan med first
och after
-metod.
The ...Paginated
frågetypen återanvänder de flesta ...List
frågetypsfunktioner (filtrering, sortering), men i stället för att använda offset
/limit
argument, använder first
/after
argument som definieras av GraphQL Cursor Connections Specification. Du hittar en mindre formell introduktion i GraphQL introduktion.
first
: The n
de första objekten som ska returneras.50
.100
.after
: Den markör som bestämmer början på den begärda sidan. Observera att det objekt som markören representerar inte ingår i resultatuppsättningen. markören för ett objekt bestäms av cursor
fält för edges
struktur.Du kan till exempel skriva ut en resultatsida som innehåller upp till fem äventyr, med början från det angivna markörobjektet i complete resultatlista:
query {
adventurePaginated(first: 5, after: "ODg1MmMyMmEtZTAzMy00MTNjLThiMzMtZGQyMzY5ZTNjN2M1") {
edges {
cursor
node {
title
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
Vid sidindelning används som standard UUID för databasnoden som representerar fragmentet för att säkerställa att resultatordningen alltid är densamma. När sort
används UUID implicit för att säkerställa en unik sortering, även för två objekt med identiska sorteringsnycklar.
På grund av interna tekniska begränsningar försämras prestanda om sortering och filtrering tillämpas på kapslade fält. Därför bör du använda filter-/sorteringsfält som lagras på rotnivå. Detta är också det rekommenderade sättet om du vill fråga stora sidnumrerade resultatuppsättningar.
Med webboptimerad bildleverans kan du använda en Graphql-fråga för att:
Begär en URL till en AEM
Skicka parametrar med frågan så att en viss återgivning av bilden genereras och returneras automatiskt
Den angivna återgivningen lagras inte i AEM Assets. Återgivningen genereras och sparas i cache-minnet under en kort period.
Returnera URL:en som en del av JSON-leveransen
Du kan använda AEM för att:
Det innebär att kommandona tillämpas under frågekörningen, på samma sätt som URL-parametrar vid GET-begäranden för dessa bilder.
På så sätt kan du dynamiskt skapa bildåtergivningar för JSON-leverans, vilket innebär att du slipper skapa och lagra dessa återgivningar manuellt i databasen.
Med GraphQL kan man
use _dynamicUrl
på ImageRef
referens
add _assetTransform
till listrubriken där filtren har definierats
AssetTransform
(_assetTransform
) används för att göra URL-omvandlingsbegäranden.
Strukturen och syntaxen är:
format
: en uppräkning med alla format som stöds av tillägget: GIF, PNG, PNG8, JPG, PJPG, BJPG, WEBP, WEBPLL eller WEBPLYseoName
: en sträng som ska användas som filnamn i stället för nodnamnetcrop
: en understruktur för en bildruta, om bredd eller höjd utelämnas, används höjden eller bredden som samma värde
xOrigin
: bildrutans x-ursprung och är obligatorisktyOrigin
: ramens y-ursprung och är obligatorisktwidth
: ramens breddheight
: ramens höjdsize
: en dimensionsunderstruktur, om bredd eller höjd utelämnas, används höjden eller bredden som samma värde
width
: dimensionens breddheight
: dimensionens höjdrotation
: en uppräkning av alla rotationer som stöds: R90, R180, R270flip
: en uppräkning av HORIZONTAL, VERTICAL, HORIZONTAL_AND_VERTICALquality
: ett heltal mellan 1 och 100 som anger procentvärdet för bildkvalitetenwidth
: ett heltal som definierar bredden på utdatabilden men ignoreras av Image GeneratorpreferWebp
: ett booleskt värde som anger om webben är att föredra (standardvärdet är false)URL-omformningen är tillgänglig för alla frågetyper: efter sökväg, lista eller sidnumrering.
Här följer ett exempel på en fråga med en fullständig uppsättning parametrar:
{
articleList(
_assetTransform: {
format:GIF
seoName:"test"
crop:{
xOrigin:10
yOrigin:20
width:50
height:45
}
size:{
height:100
width:200
}
rotation:R90
flip:HORIZONTAL_AND_VERTICAL
quality:55
width:123
preferWebp:true
}
) {
items {
_path
featuredImage {
... on ImageRef {
_dynamicUrl
}
}
}
}
}
I följande exempel visas användningen av en enda frågevariabel:
query ($seoName: String!) {
articleList(
_assetTransform: {
format:GIF
seoName:$seoName
crop:{
xOrigin:10
yOrigin:20
width:50
height:45
}
size:{
height:100
width:200
}
rotation:R90
flip:HORIZONTAL_AND_VERTICAL
quality:55
width:123
preferWebp:true
}
) {
items {
_path
featuredImage {
... on ImageRef {
_dynamicUrl
}
}
}
}
}
I följande exempel visas hur flera frågevariabler används:
query ($seoName: String!, $format: AssetTransformFormat!) {
articleList(
_assetTransform: {
format:$format
seoName:$seoName
crop:{
xOrigin:10
yOrigin:20
width:50
height:45
}
size:{
height:100
width:200
}
rotation:R90
flip:HORIZONTAL_AND_VERTICAL
quality:55
width:123
preferWebp:true
}
) {
items {
_path
featuredImage {
... on ImageRef {
_dynamicUrl
}
}
}
}
}
Om du sparar frågan som en beständig fråga (till exempel med namnet dynamic-url-x
) kan du köra den beständiga frågan direkt.
Om du till exempel vill köra de tidigare exemplen direkt (sparade som beständiga frågor) använder du följande URL:er:
En parameter; Beständig fråga med namnet dynamic-url-x
http://localhost:4502/graphql/execute.json/wknd-shared/dynamic-url-x;seoName=xxx
Svaret ser ut så här:
Flera parametrar; Beständig fråga med namnet dynamic
http://localhost:4502/graphql/execute.json/wknd-shared/dynamic;seoName=billiboy;format=GIF;
Efterföljande ;
är obligatoriskt för att utan problem avsluta parameterlistan.
Följande begränsningar finns:
Modifierare som används för alla bilder i frågan (globala parametrar)
Cachelagra rubriker
Den grundläggande funktionen för frågor med GraphQL för AEM följer GraphQL standardspecifikation. För GraphQL-frågor med AEM finns det några tillägg:
Om du behöver ett enda resultat:
Om du förväntar dig en resultatlista:
List
till modellnamnet, till exempel cityList
Då kan du:
ASC
: stigandeDESC
: fallandeReturnera en resultatsida med antingen:
Om du vill använda ett logiskt OR:
_logOp: OR
Logiskt AND finns också, men är (ofta) implicit
Du kan fråga efter fältnamn som motsvarar fälten i innehållsfragmentmodellen
Förutom fälten från modellen finns det vissa systemgenererade fält (föregås av understreck):
För innehåll:
_locale
: för att avslöja språket, baserat på Language Manager
_metadata
: för att visa metadata för ditt fragment
_model
: tillåt frågor för en innehållsfragmentmodell (sökväg och rubrik)
_path
: sökvägen till ditt innehållsfragment i databasen
_reference
: avslöja referenser, inkludera textbundna referenser i RTF-redigeraren
_variation
: för att visa specifika variationer i ditt innehållsfragment
Om den angivna varianten inte finns för ett innehållsfragment returneras den överordnad varianten som ett (fallback) standardvärde.
För bildleverans:
_dynamicUrl
: på ImageRef
referens
_assetTransform
: i listrubriken där filtren har definierats
Se:
Och åtgärder:
_operator
: tillämpa särskilda operatörer, EQUALS
, EQUALS_NOT
, GREATER_EQUAL
, LOWER
, CONTAINS
, STARTS_WITH
_apply
: tillämpa särskilda villkor, till exempel AT_LEAST_ONCE
_ignoreCase
: för att ignorera skiftläget vid fråga
GraphQL-unionstyper stöds:
Reservation vid fråga om kapslade fragment:
Om du vill komma åt GraphQL-slutpunkten från en extern webbplats måste du konfigurera:
Se Autentisering för fjärrfrågor AEM GraphQL-frågor om innehållsfragment.
Frågor som har uppstått:
Q: "Hur skiljer sig GraphQL API för AEM från Query Builder API?"
Söker du en praktisk självstudiekurs? Checka ut Komma igång med AEM Headless och GraphQL en komplett självstudiekurs som visar hur man bygger upp och exponerar innehåll med AEM GraphQL API:er och som används av en extern app, i ett headless CMS-scenario.