管理AEM主機
部署AEM Headless應用程式時,需要注意AEM URL的建構方式,以確保使用正確的AEM主機/網域。 要注意的主要URL/請求型別為:
- 對 AEM GraphQL API 的HTTP請求
- 影像URL 到內容片段中參考且由AEM傳送的影像資產
通常AEM Headless應用程式會針對GraphQL API和影像要求與單一AEM服務互動。 AEM服務會根據AEM Headless應用程式部署而變更:
若要處理部署型別排列,每個應用程式部署都是使用指定要連線的AEM服務的設定所建置。 接著會使用已設定的AEM服務主機/網域來建構AEM GraphQL API URL和影像URL。 若要判斷管理組建相依設定的正確方法,請參考AEM Headless應用程式的架構(例如React、iOS、Android™等)檔案,因為方法會因架構而異。
下列範例是為AEM GraphQL API和影像要求建構URL的可能方法,適用於幾個熱門的Headless架構和平台。
AEM GraphQL API要求
從Headless應用程式到AEM的GraphQL API的HTTPGET要求必須設定為與正確的AEM服務互動,如上方🔗的表格所述。
使用AEM Headless SDK (適用於瀏覽器式JavaScript、伺服器式JavaScript和Java™)時,AEM主機可以使用AEM服務初始化AEM Headless使用者端物件以與其連線。
開發自訂AEM Headless使用者端時,請確定AEM服務的主機可以根據組建引數引數化。
範例
以下範例說明AEM GraphQL API要求如何讓AEM主機值可供各種Headless應用程式架構設定。
此範例大致以AEM Headless React應用程式為基礎,說明如何設定AEM GraphQL API要求以根據環境變數連線至不同的AEM Services。
React應用程式應使用適用於JavaScript🔗的AEM Headless使用者端,與AEM的GraphQL API互動。 適用於JavaScript的AEM Headless使用者端所提供的AEM Headless使用者端必須透過其連線的AEM Service主機進行初始化。
React環境檔案
React使用儲存在專案根目錄中的自訂環境檔案或.env
檔案來定義組建特定值。 例如,.env.development
檔案包含在開發期間使用的值,而.env.production
包含用於生產組建的值。
.env.development
code language-none |
---|
|
可以將.env
和語意描述元(例如.env.stage
或.env.production
)後置化,以指定.env
檔案供其他用途使用。 執行npm
命令前設定REACT_APP_ENV
,可在執行或建置React應用程式時使用不同的.env
檔案。
例如,React應用程式的package.json
可能包含下列scripts
設定:
package.json
code language-none |
---|
|
AEM headless使用者端
適用於JavaScript🔗的AEM Headless使用者端包含AEM Headless使用者端,會向AEM的GraphQL API發出HTTP請求。 AEM Headless使用者端必須使用使用中.env
檔案的值與其互動的AEM主機進行初始化。
src/api/headlessClient.js
code language-none |
---|
|
React useEffect(…) 勾點
自訂React useEffect掛接會呼叫AEM Headless使用者端,並代表呈現檢視的React元件以AEM主機初始化。
src/api/persistedQueries.js
code language-javascript |
---|
|
React元件
自訂useEffect鉤點useAdventureByPath
已匯入,並用於使用AEM Headless使用者端取得資料,最終將內容呈現給一般使用者。
- 'src/components/AdventureDetail.js'
code language-javascript |
---|
|
此範例以範例AEM Headless iOS™應用程式為基礎,說明如何設定AEM GraphQL API要求以根據組建特定設定變數連線至不同的AEM主機。
iOS™應用程式需要自訂AEM Headless使用者端,才能與AEM的GraphQL API互動。 必須撰寫AEM Headless使用者端,以設定AEM服務主機。
建置設定
XCode組態檔案包含預設組態詳細資訊。
Config.xcconfig
code language-swift |
---|
|
初始化自訂AEM Headless使用者端
範例AEM Headless iOS應用程式使用以AEM_SCHEME
和AEM_HOST
的設定值初始化的自訂AEM Headless使用者端。
code language-swift |
---|
|
自訂AEM Headless使用者端(api/Aem.swift
)包含方法makeRequest(..)
,其會以設定的AEM scheme
和host
為AEM GraphQL API要求加上前置詞。
api/Aem.swift
code language-swift |
---|
|
可以建立新的組建組態檔以連線到不同的AEM服務。 AEM_SCHEME
和AEM_HOST
的組建特定值是根據XCode中選取的組建使用,導致自訂AEM Headless使用者端連線到正確的AEM服務。
此範例以範例AEM Headless Android™應用程式為基礎,說明如何設定AEM GraphQL API要求以根據組建特定(或風格)設定變數連線至不同的AEM Services。
Android™應用程式(以Java™撰寫時)應使用AEM Headless Client for Java™與AEM的GraphQL API互動。 適用於Java™的AEM Headless使用者端所提供的AEM Headless使用者端必須透過其連線的AEM Service主機進行初始化。
建置組態檔
Android™應用程式會定義「productFlavors」,以針對不同用途建置成品。
此範例顯示如何定義兩種Android™產品風格,提供開發(dev
)和生產(prod
)使用的不同AEM服務主機(AEM_HOST
)值。
在應用程式的build.gradle
檔案中,已建立名為env
的新flavorDimension
。
在env
維度中,定義了兩個productFlavors
: dev
和prod
。 每個productFlavor
都使用buildConfigField
來設定組建特定的變數,這些變數定義要連線的AEM服務。
app/build.gradle
code language-gradle |
---|
|
Android™載入器
使用buildConfigField
欄位中的AEM_HOST
值初始化AEM Headless Client for Java™提供的AEMHeadlessClient
產生器。
app/src/main/java/com/adobe/wknd/androidapp/loader/AdventuresLoader.java
code language-java |
---|
|
為不同用途建置Android™應用程式時,請指定env
風格,並使用對應的AEM主機值。
AEM影像URL
從Headless應用程式到AEM的影像要求必須設定為與正確的AEM服務互動,如上表🔗中的所述。
Adobe建議使用AEMGraphQL API中透過_dynamicUrl
欄位提供的最佳化影像。 _dynamicUrl
欄位傳回無主機URL,其前置詞可為用於查詢AEM GraphQL API的AEM服務主機。 在GraphQL回應中的_dynamicUrl
欄位看起來如下所示:
{
...
"_dynamicUrl": "/adobe/dynamicmedia/deliver/dm-aid--dd42d814-88ec-4c4d-b5ef-e3dc4bc0cb42/example.jpg?preferwebp=true",
...
}
範例
以下範例說明影像URL為多種Headless應用程式架構所設定的AEM主機值加上前置詞的方式。 這些範例假設使用GraphQL查詢,這些查詢使用_dynamicUrl
欄位傳回影像參考。
例如:
GraphQL持續查詢
此GraphQL查詢傳回影像參考的_dynamicUrl
。 如排除主機的GraphQL回應中所示。
query ($path: String!) {
adventureByPath(_path: $path, _assetTransform: { format: JPG, preferWebp: true }) {
item {
title,
primaryImage {
... on ImageRef {
_dynamicUrl
}
}
}
}
}
GraphQL回應
此GraphQL回應會傳回影像參考的_dynamicUrl
(排除主機)。
{
"data": {
"adventureByPath": {
"item": {
"adventurePrimaryImage": {
"_dynamicUrl": "/adobe/dynamicmedia/deliver/dm-aid--de43411-88ec-4c4d-b5ef-e3dc4bc0cb42/adobestock-175749320.jpg?preferwebp=true",
}
}
}
}
}
此範例以範例AEM Headless React應用程式為基礎,說明如何將影像URL設定為根據環境變數連線到正確的AEM Services。
此範例顯示如何使用可設定的REACT_APP_AEM_HOST
React環境變數為影像參考_dynamicUrl
欄位加上前置詞。
React環境檔案
React使用儲存在專案根目錄中的自訂環境檔案或.env
檔案來定義組建特定值。 例如,.env.development
檔案包含在開發期間使用的值,而.env.production
包含用於生產組建的值。
.env.development
code language-none |
---|
|
可以將.env
和語意描述元(例如.env.stage
或.env.production
)後置化,以指定.env
檔案供其他用途使用。 執行npm
命令前設定REACT_APP_ENV
,可在執行或建置React應用程式時使用不同的.env
檔案。
例如,React應用程式的package.json
可能包含下列scripts
設定:
package.json
code language-none |
---|
|
React元件
React元件會匯入REACT_APP_AEM_HOST
環境變數,並在影像_dynamicUrl
值加上前置詞,以提供完全可解析的影像URL。
這個相同的REACT_APP_AEM_HOST
環境變數可用來初始化useAdventureByPath(..)
個自訂useEffect勾點所使用的AEM Headless使用者端,該勾點用來從AEM擷取GraphQL資料。 使用相同的變數來建構GraphQL API要求作為影像URL,請確定React應用程式會在兩個使用案例中與相同的AEM服務互動。
- 'src/components/AdventureDetail.js'
code language-javascript |
---|
|
此範例以範例AEM Headless iOS™應用程式為基礎,說明如何設定AEM影像URL以根據組建特定設定變數連線至不同的AEM主機。
建置設定
XCode組態檔案包含預設組態詳細資訊。
Config.xcconfig
code language-swift |
---|
|
影像URL產生器
在Aem.swift
自訂AEM Headless使用者端實作中,自訂函式imageUrl(..)
會採用GraphQL回應中_dynamicUrl
欄位所提供的影像路徑,並在其前面加上AEM的主機。 然後每當影像轉譯時,就會在iOS檢視中叫用此函式。
WKNDAdventures/AEM/Aem.swift
code language-swift |
---|
|
iOS檢視
iOS檢視並加上影像_dynamicUrl
值的前置詞,以提供完全可解析的影像URL。
WKNDAdventures/Views/AdventureListItemView.swift
code language-swift |
---|
|
可以建立新的組建組態檔以連線到不同的AEM服務。 AEM_SCHEME
和AEM_HOST
的組建特定值是根據XCode中選取的組建使用,導致自訂AEM Headless使用者端與正確的AEM服務互動。
此範例是以範例AEM Headless Android™應用程式為基礎,說明如何設定AEM影像URL,以根據組建特定(或風格)設定變數連線至不同的AEM Services。
建置組態檔
Android™應用程式會定義「productFlavors」,以針對不同用途建置成品。
此範例顯示如何定義兩種Android™產品風格,提供開發(dev
)和生產(prod
)使用的不同AEM服務主機(AEM_HOST
)值。
在應用程式的build.gradle
檔案中,已建立名為env
的新flavorDimension
。
在env
維度中,定義了兩個productFlavors
: dev
和prod
。 每個productFlavor
都使用buildConfigField
來設定組建特定的變數,這些變數定義要連線的AEM服務。
app/build.gradle
code language-gradle |
---|
|
正在載入AEM影像
Android™使用ImageGetter
從AEM擷取及本機快取影像資料。 在prepareDrawableFor(..)
中,AEM服務主機(定義於使用中的組建組態)是用來為影像路徑加上前置詞,以建立AEM的可解析URL。
app/src/main/java/com/adobe/wknd/androidapp/loader/RemoteImagesCache.java
code language-java |
---|
|
Android™ view
Android™檢視會使用GraphQL回應中的_dynamicUrl
值,透過RemoteImagesCache
取得影像資料。
app/src/main/java/com/adobe/wknd/androidapp/AdventureDetailFragment.java
code language-java |
---|
|
為不同用途建置Android™應用程式時,請指定env
風格,並使用對應的AEM主機值。