了解如何搭配AEM GraphQL API使用Adobe Experience Manager(AEM)中的內容片段進行無頭式內容傳送。
與內容片段搭配使用的 AEM GraphQL API,在很大程度上是以標準、開放原始碼的 GraphQL API 為基礎。
在 AEM 中使用 GraphQL API 可以在 Headless CMS 實作中高效率地將內容片段傳遞給 JavaScript 用戶端:
GraphQL目前用於Adobe Experience Manager(AEM)的兩種(個別)情況:
GraphQL 是:
「…API 的查詢語言和使用現有資料完成這些查詢的執行階段。GraphQL 可完整清楚地描述 API 中的資料,使用戶端能夠準確地要求所需內容,別無其他,如此可輕鬆地隨著時間發展 API,造就強大的開發人員工具。」。
請參閱 GraphQL.org
「…靈活 API 層的開放規格。將 GraphQL 置於現有後端之上,可比以往更快速地建置產品…」。
請參閱探索 GraphQL。
「…一種資料查詢語言和規格,由 Facebook 於 2012 年在內部開發,然後於 2015 年公開原始碼。它提供了 REST 式架構的替代方案,目的是提高開發人員的生產力並盡量減少傳輸的資料量。GraphQL 用於生產環境,數百個各種規模的組織都在使用…」
請參閱 GraphQL 基礎。
有關 GraphQL API 的更多資訊,請參閱以下章節 (以及許多其他資源):
位於 graphql.org:
位於 graphql.com:
GraphQL for AEM 實作是以標準 GraphQL Java 庫為基礎。請參閱:
GraphQL 使用以下項目:
AEM 中回應 GraphQL 查詢並提供 GraphQL 結構描述存取權的路徑。
如需詳細資訊,請參閱啟用 GraphQL 端點。
請參閱 (GraphQL.org) GraphQL 簡介 了解完整的詳細資訊,包括最佳做法。
使用 GraphQL,您可以執行查詢以傳回以下兩者之一:
單一項目
AEM 提供將查詢 (兩種類型) 轉換為🔗持續性查詢的功能,可由 Dispatcher 和 CDN 快取。
持續性查詢是建議用於發佈執行個體的方法,如下:
作者上通常沒有dispatcher/CDN,因此使用持續的查詢不會提高效能;除了測試它們。
不建議使用 POST 要求的 GraphQL 查詢,因為它們不會被快取,因此在預設執行個體上,Dispatcher 設定為阻擋此類查詢。
雖然 GraphQL 也支援 GET 要求,但這些要求可能會達到限制 (例如 URL 的長度),而使用持續性查詢可以避免此狀況。
執行直接查詢的功能可能會在未來的某個時間被淘汰。
標準的實施 GraphiQL 介面可與AEM GraphQL搭配使用。
GraphiQL 包含在 AEM 的所有環境中 (但只有在您配定端點時才可存取/可見)。
在先前版本,需要套件來安裝 GraphiQL IDE。如果您已安裝,現在可以將其移除。
此介面允許您直接輸入和測試查詢。
例如:
http://localhost:4502/content/graphiql.html
這提供語法醒目提示、自動完成、自動建議等功能,以及歷史記錄和線上檔案:
如需詳細資訊,請參閱 使用GraphiQL IDE.
使用案例取決於AEM環境的類型:
發佈環境:用於:
作者環境:用於:
權限是存取資產所需的權限。
GraphQL 查詢是在基礎要求之 AEM 使用者的許可下執行的。如果使用者沒有某些片段 (儲存為資產) 的讀取權限,它們將不會包含在結果集中。
此外,使用者必須可以存取 GraphQL 端點才能執行 GraphQL 查詢。
GraphQL 是強式類型 API,這表示資料必須結構明確並按類型組織。
GraphQL 規格提供了一系列指南,說明如何建立健全的 API 來查詢特定執行個體上的資料。為此,用戶端需要擷取結構描述,其中包含查詢所需的所有類型。
對於內容片段,GraphQL 結構描述 (結構和類型) 是以啟用的內容片段模型 及其資料類型為基礎。
所有 GraphQL 結構描述 (衍生自已啟用的內容片段模型) 都可透過 GraphQL 端點讀取。
這表示您必須確保沒有敏感資料,因為它可能會以這種方式洩露;例如,這包括可以在模型定義中做為欄位名稱出現的資訊。
例如,如果使用者建立的內容片段模型稱為 Article
,則AEM會產生物件 article
屬於 ArticleModel
. 此類型中的欄位對應於模型中定義的欄位和資料類型。
內容片段模型:
對應的 GraphQL 結構描述 (來自 GraphiQL 自動文件的輸出):
此顯示產生的類型 ArticleModel
包含多個欄位。
其中三個已由使用者控制:author
、main
和 referencearticle
。
其他欄位是由AEM自動新增的,是提供特定內容片段相關資訊的實用方法;在本例中, _path
, _metadata
, _variations
. 這些 Helper 欄位 前面加上 _
以區分是使用者定義的還是自動產生的。
使用者根據文章模型建立內容片段後,就可以透過 GraphQL 對其進行查詢。例如,請參閱範例查詢 (根據與 GraphQL 搭配使用的範例內容片段結構)。
在 GraphQL for AEM 中,結構描述是靈活的。這表示著每次建立、更新或刪除內容片段模型時都會自動產生它。當您更新內容片段模型時,資料結構描述快取也會重新整理。
Sites GraphQL 服務偵聽 (在背景) 對內容片段模型所做的任何修改。當偵測到更新時,只有該部分的結構描述會重新產生。這種最佳化作業可以節省時間並提供穩定性。
例如,您可以:
安裝包含 Content-Fragment-Model-1
和 Content-Fragment-Model-2
的套件:
Model-1
和 Model-2
的 GraphQL 類型。然後修改 Content-Fragment-Model-2
:
只有 Model-2
GraphQL 類型會更新。
而 Model-1
將保持不變。
如果您想透過 REST API 或其他方式對內容片段模型進行大量更新,請務必注意這一點。
結構描述透過與 GraphQL 查詢相同的端點提供服務,用戶端處理以 GQLschema
副檔名呼叫結構描述這一事實。例如,對 /content/cq:graphql/global/endpoint.GQLschema
執行簡單的 GET
要求,將導致內容類型為 text/x-graphql-schema;charset=iso-8859-1
的結構描述輸出。
巢狀內嵌內容片段時,可能會發佈父內容片段模型,但不會發佈被參考的模型。
AEM UI 可防止這種情況發生,但如果以程式設計方式或使用內容套件進行發佈,則可能會發生這種情況。
發生這種情況時,AEM 會為父內容片段模型產生不完整結構描述。這表示相依於未發佈模型的片段參考已從結構描述中刪除。
在結構描述中有個別欄位,分成兩個基本類別:
產生的欄位。
選取 欄位類型 可用來根據您如何設定內容片段模型來建立欄位。 欄位名稱取自 屬性名稱 欄位 資料類型.
GraphQL for AEM 也會產生許多 Helper 欄位。
這些用於識別內容片段,或用於取得有關內容片段的詳細資訊。
GraphQL for AEM 支援類型清單。表示所有支援的內容片段模型資料類型和對應的 GraphQL 類型:
內容片段模型 - 資料類型 | GraphQL 類型 | 說明 |
---|---|---|
單行文字 | 字串,[字串] | 用於簡單字串,例如作者名稱、位置名稱等。 |
多行文字 | 字串 | 用於輸出文字,例如文章正文 |
數字 | 浮動,[浮動] | 用於顯示浮點數和正規數 |
布林值 | 布林值 | 用於顯示核取方塊 → 簡單的 true/false 陳述式 |
日期和時間 | 日曆 | 用於以ISO 8086格式顯示日期和時間。 視所選類型而定,AEM GraphQL 中可使用三種風格:onlyDate 、onlyTime 、dateTime |
列舉 | 字串 | 用於顯示模型建立時定義之選項清單中的選項 |
標記 | [字串] | 用於顯示字串清單,字串代表 AEM 中使用的標記 |
內容參考 | 字串 | 用於顯示 AEM 中另一個資產的路徑 |
片段參考 | 模型類型 | 用於參考特定模型類型的另一個內容片段,在建立模型時定義 |
除了使用者產生之欄位的資料類型外,GraphQL for AEM 也會產生許多 Helper 欄位,以協助識別內容片段,或提供有關內容片段的其他資訊。
路徑欄位作為 GraphQL 中的標識符。它代表 AEM 存放庫中內容片段資產的路徑。我們選擇此作為內容片段的識別碼,因為它:
下列程式碼會顯示根據內容片段模型建立的所有內容片段路徑 Person
.
{
personList {
items {
_path
}
}
}
若要撷取特定類型的單一內容片段,您還需要先確定其路徑。例如:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_path
firstName
name
}
}
}
請參閱範例查詢 - 單一特定城市片段。
透過 GraphQL,AEM 還公開內容片段的中繼資料。中繼資料是描述內容片段的資訊,例如內容片段的標題、縮圖路徑、內容片段的說明、建立日期等。
由於中繼資料是透過結構描述編輯器產生的,因此沒有特定的結構,所以實作 TypedMetaData
GraphQL 類型來公開內容片段的中繼資料。TypedMetaData
公開依以下純量類型群組的資訊:
欄位 |
---|
stringMetadata:[StringMetadata]! |
stringArrayMetadata:[StringArrayMetadata]! |
intMetadata:[IntMetadata]! |
intArrayMetadata:[IntArrayMetadata]! |
floatMetadata:[FloatMetadata]! |
floatArrayMetadata:[FloatArrayMetadata]! |
booleanMetadata:[BooleanMetadata]! |
booleanArrayMetadata:[booleanArrayMetadata]! |
calendarMetadata:[CalendarMetadata]! |
calendarArrayMetadata:[CalendarArrayMetadata]! |
每個純量類型代表單一名稱-值配對或名稱-值配對組,配對中的值屬於該群組的類型。
例如,如果你想擷取內容片段的標題,我們知道這個屬性是字串屬性,所以我們會查詢所有的字串中繼資料:
若要查詢中繼資料:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_path
_metadata {
stringMetadata {
name
value
}
}
}
}
}
如果檢視產生的 GraphQL 結構描述,則可以檢視所有中繼資料 GraphQL 類型。所有模型類型都具有相同的 TypedMetaData
。
一般和陣列中繼資料的區別
請記住,StringMetadata
和 StringArrayMetadata
都是指儲存在存放庫的中繼資料,而不是擷取它們的方式。
例如,呼叫 stringMetadata
欄位,您將收到以 String
儲存在存放庫之所有中繼資料的陣列,如果呼叫 stringArrayMetadata
,則會收到以 String[]
儲存在存放庫之所有中繼資料的陣列。
_variations
欄位已實作以簡化查詢內容片段具有的變化。例如:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_variations
}
}
}
如果內容片段不存在給定的變化,則主變化將作為 (備援) 預設值傳回。
GraphQL 允許在查詢中放置變數。有關詳細資訊,您可以參閱 用於變數的 GraphQL 文件。
例如,若要取得類型的所有內容片段 Article
具有特定變數時,您可以指定變數 variation
在GraphiQL中。
### query
query GetArticlesByVariation($variation: String!) {
articleList(variation: $variation) {
items {
_path
author
_variations
}
}
}
### in query variables
{
"variation": "uk"
}
在 GraphQL 中,可以根據變數變更查詢,稱為 GraphQL 指示詞。
例如,您可以根據變數 includePrice
,在對所有 AdventureModels
的查詢中加入 adventurePrice
欄位。
### query
query GetAdventureByType($includePrice: Boolean!) {
adventureList {
items {
adventureTitle
adventurePrice @include(if: $includePrice)
}
}
}
### in query variables
{
"includePrice": true
}
您還可以在 GraphQL 查詢中使用篩選來傳回特定資料。
篩選使用以邏輯運算子和運算式的語法。
例如,下列(基本)查詢會篩選名稱為 Jobs
或 Smith
:
query {
personList(filter: {
name: {
_logOp: OR
_expressions: [
{
value: "Jobs"
},
{
value: "Smith"
}
]
}
}) {
items {
name
firstName
}
}
}
如需進一步範例,請參閱:
GraphQL for AEM 擴充功能 的詳細資訊
使用 GraphQL for AEM 進行查詢的基本操作符合標準 GraphQL 規格。使用 GraphQL for AEM 進行查詢,有一些擴充功能:
如果您需要單一結果:
如果您期望結果清單:
List
到模型名稱,例如 cityList
篩選 includeVariations
包含在 List
查詢類型。 若要擷取查詢結果中的內容片段變化,請 includeVariations
篩選器必須設為 true
.
篩選 includeVariations
不能與系統生成的欄位一起使用 _variation
.
如果要使用邏輯 OR:
_logOp: OR
邏輯 AND 也存在,但 (通常) 是隱含的
您可以查詢與內容片段模型內欄位相對應的欄位名稱
除了模型內的欄位外,還有一些系統產生的欄位 (前面有底線):
對於內容:
_locale
:顯示語言,根據語言管理員
_metadata
:顯示片段的中繼資料
_model
:允許查詢內容片段模型 (路徑和標題)
_path
:存放庫中內容片段的路徑
_reference
:顯示參考;包含 RTF 編輯器中的內聯參考
_variation
:顯示內容片段中的特定變化
如果內容片段不存在給定的變化,則主變化將作為 (備援) 預設值傳回。
系統產生的欄位 _variation
無法與篩選器搭配使用 includeVariations
.
_tags
:顯示包含標籤之內容片段或變體的ID;這是 cq:tags
識別碼。
您也可以列出內容片段的中繼資料來查詢標籤。
_operator
:套用特定的運算子;EQUALS
、EQUALS_NOT
、GREATER_EQUAL
、LOWER
、CONTAINS
、STARTS_WITH
_apply
:套用特定條件;例如,AT_LEAST_ONCE
_ignoreCase
:查詢時忽略大小寫
支援 GraphQL 聯合類型:
... on
查詢巢狀片段時的備援:
如需 AEM 中 CORS 資源共用原則的詳細概述,請參閱了解跨原始資源共用 (CORS)。
若要存取GraphQL端點,必須在客戶Git存放庫中設定CORS原則。 做法是為所需端點新增適當的 OSGi CORS 設定。
此配置必須指定受信任的網站源 alloworigin
或 alloworiginregexp
必須授予其存取權。
例如,若要授予 GraphQL 端點 和 https://my.domain
之持續性查詢端點的存取權,您可以使用:
{
"supportscredentials":true,
"supportedmethods":[
"GET",
"HEAD",
"POST"
],
"exposedheaders":[
""
],
"alloworigin":[
"https://my.domain"
],
"maxage:Integer":1800,
"alloworiginregexp":[
""
],
"supportedheaders":[
"Origin",
"Accept",
"X-Requested-With",
"Content-Type",
"Access-Control-Request-Method",
"Access-Control-Request-Headers"
],
"allowedpaths":[
"/content/_cq_graphql/global/endpoint.json",
"/graphql/execute.json/.*"
]
}
如果您為端點設定了虛名路徑,您也可以在 allowedpaths
中使用它。
除了CORS設定,反向連結篩選器還必須設定為允許從第三方主機存取。
若要這麼做,請新增適當的OSGi反向連結篩選設定檔案,該設定檔案可:
allow.hosts
或 allow.hosts.regexp
,例如,要授予使用查閱者 my.domain
之要求的存取權,您可以:
{
"allow.empty":false,
"allow.hosts":[
"my.domain"
],
"allow.hosts.regexp":[
""
],
"filter.methods":[
"POST",
"PUT",
"DELETE",
"COPY",
"MOVE"
],
"exclude.agents.regexp":[
""
]
}
客戶有責任:
所有 GraphQL 結構描述 (衍生自已啟用的內容片段模型) 都可透過 GraphQL 端點讀取。
這表示您必須確保沒有敏感資料,因為它可能會以這種方式洩露;例如,這包括可以在模型定義中做為欄位名稱出現的資訊。
請參閱針對內容片段之遠端 AEM GraphQL 查詢的驗證。
出現的問題:
問題:「GraphQL API for AEM 與查詢產生器 API 有何不同?」
正在尋找實作教學課程?查看AEM Headless 和 GraphQL 快速入門端對端教學課程,說明如何在 Headless CMS 情境下使用 AEM GraphQL API 建立和公開內容並供外部應用程式取用。