管理AEM主机
部署AEM Headless应用程序时,需要注意如何构建AEM URL,以确保使用正确的AEM主机/域。 要了解的主要URL/请求类型为:
- 对 AEM GraphQL API 的HTTP请求
 - 图像URL,指向内容片段中引用并由AEM交付的图像资源
 
通常,AEM Headless应用程序会与单个AEM服务交互,以用于GraphQL API和图像请求。 AEM服务因AEM Headless应用程序部署而异:
为了处理部署类型排列,每个应用程序部署都是使用指定要连接的AEM服务的配置构建的。 随后使用配置的AEM服务的主机/域来构建AEM GraphQL API URL和图像URL。 要确定管理生成相关配置的正确方法,请参阅AEM Headless应用程序的框架(例如,React、iOS™Android等)文档,因为该方法因框架而异。
以下是一些可能的方法示例,这些方法用于为几个常用的Headless框架和平台构建AEM GraphQL API和图像请求的URL。
AEM GraphQL API请求
必须配置从Headless应用程序到AEM的GraphQL API的HTTP GET请求,以便与正确的AEM服务交互,如上面表中所述。
使用AEM Headless SDK(可用于基于浏览器的JavaScript、基于服务器的JavaScript和Java™)时,AEM主机可以通过AEM服务初始化AEM Headless客户端对象以与之连接。
在开发自定义AEM Headless客户端时,请确保AEM服务的主机可以根据构建参数进行参数化。
示例
以下示例介绍了如何使AEM GraphQL API请求能够针对各种Headless应用程序框架配置AEM主机值。
此示例大致基于AEM Headless React应用程序,说明了如何将AEM GraphQL API请求配置为根据环境变量连接到不同的AEM服务。
React应用程序应使用适用于JavaScript的AEM Headless客户端与AEM的GraphQL API交互。 由AEM Headless Client for JavaScript提供的AEM Headless客户端必须使用它连接到的AEM服务主机进行初始化。
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请求。 必须使用活动.env文件中的值将AEM Headless客户端与其交互的AEM主机初始化。
src/api/headlessClient.js
| code language-none | 
|---|
                      
                     | 
                  
React useEffect(…)挂接
自定义React useEffect挂接调用AEM Headless客户端,通过AEM主机初始化,以代表呈现视图的React组件。
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服务。
Android™应用程序(使用Java™编写时)应使用适用于Java™的AEM Headless客户端与AEM的GraphQL API交互。 由适用于Java™的AEM Headless客户端提供的AEM Headless客户端必须使用它连接到的AEM服务主机进行初始化。
生成配置文件
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建议使用通过AEM GraphQL API中的_dynamicUrl字段提供的优化图像。 _dynamicUrl字段返回一个无主机URL,该URL可以带有用于查询AEM GraphQL API的AEM服务主机的前缀。 对于GraphQL响应中的_dynamicUrl字段,如下所示:
{
    ...
    "_dynamicUrl": "/adobe/dynamicmedia/deliver/dm-aid--dd42d814-88ec-4c4d-b5ef-e3dc4bc0cb42/example.jpg?preferwebp=true",
    ...
}
            示例
以下示例介绍了图像URL如何为AEM主机值添加前缀,该主机值可针对各种Headless应用程序框架进行配置。 这些示例假定使用通过_dynamicUrl字段返回图像引用的GraphQL查询。
例如:
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服务。
此示例显示如何使用可配置的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服务。
生成配置文件
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™视图
Android™视图使用GraphQL响应中的_dynamicUrl值通过RemoteImagesCache获取图像数据。
app/src/main/java/com/adobe/wknd/androidapp/AdventureDetailFragment.java
| code language-java | 
|---|
                      
                     | 
                  
为不同用途构建Android™应用程序时,请指定env风格,并使用相应的AEM主机值。