Adobe Experience Manager(AEM) 资产REST API允许开发人员通过CRUD操作(创建、读取、更新、删除)直接通过HTTP API访问内容(存储在AEM中)。
API允许您通过向JavaScript前端应用程序提供内容服务,将AEM作为无外设CMS(内容管理系统)运行。 或可以执行HTTP请求和处理JSON响应的任何其他应用程序。
例如,单页应用程序(SPA)、基于框架或自定义,需要通过HTTP API提供的内容,通常采用JSON格式。
虽然AEM核心组件提供非常全面、灵活且可自定义的API,可为此提供所需的读取操作,并且其JSON输出可进行自定义,但它们确实需要AEM WCM(Web内容管理)知识来实现,因为它们必须托管在基于专用AEM模板的(API)页面中。 并非每个SPA开发组织都有权访问此类资源。
此时可以使用资产REST API。 它允许开发人员直接访问资产(例如图像和内容片段),无需先将资产嵌入页面,然后以序列化JSON格式提供其内容。 (请注意,无法从Assets REST API自定义JSON输出)。 Assets REST API还允许开发人员通过创建新资产、更新或删除现有资产、内容片段和文件夹来修改内容。
资产REST API:
在最新AEM版本的每次现成安装中都提供资产REST API。
资产REST API优惠对AEM实例中存储的资产进行REST样式访问。 它使用/api/assets
端点,并需要资产的路径才能访问它(没有前导/content/dam
)。
HTTP方法确定要执行的操作:
请求主体和/或URL参数可用于配置其中的一些操作;例如,定义文件夹或资产应由POST请求创建。
支持的请求的确切格式在API参考文档中定义。
所有请求都是原子的。
这意味着后续(write
)请求不能合并为单个实体可能成功或失败的单个事务。
长宽 | 资产REST API |
AEM组件 (使用Sling模型的组件) |
支持的用例 | 一般用途。 | 针对单页应用程序(SPA)或任何其他(内容使用)上下文中的使用情况进行了优化。 还可以包含布局信息。 |
支持的操作 | 创建、读取、更新、删除。 根据实体类型,使用其他操作。 |
只读. |
访问 | 可以直接访问。 使用映射到 例如,访问: |
需要通过AEM页面上的AEM组件进行引用。 使用 示例URL如下所示: |
安全 | 可以使用多个选项。 OAuth被提出;可以与标准设置分开配置。 |
使用AEM标准设置。 |
建筑评论 | 写访问通常将解决作者实例。 读取也可以定向到发布实例。 |
由于此方法是只读的,因此它通常用于发布实例。 |
输出 | 基于JSON的SIREN输出:详细,但功能强大。 允许在内容中导航。 | 基于JSON的专有输出;可通过Sling Models进行配置。 导航内容结构很难实现(但不一定不可能)。 |
如果在没有特定身份验证要求的环境内使用资产REST API,则需要正确配置AEM CORS筛选器。
有关更多信息,请参阅:
对于具有特定身份验证要求的环境,建议使用OAuth。
内容片段是资产的特定类型,请参阅使用内容片段。
有关通过API提供的功能的更多信息,请参阅:
资产REST API支持通过URL参数进行分页(对于GET请求):
offset
-要检索的第一个(子)实体的编号limit
-返回的最大实体数响应将包含作为SIREN输出properties
部分的分页信息。 此srn:paging
属性包含请求中指定的(子)实体(total
)总数、偏移量和限制(offset
, limit
)。
分页通常应用于容器实体(即,具有演绎版的文件夹或资产),因为它与所请求实体的子项相关。
GET /api/assets.json?offset=2&limit=3
...
"properties": {
...
"srn:paging": {
"total": 7,
"offset": 2,
"limit": 3
}
...
}
...
文件夹用作资产和其他文件夹的容器。 它们反映了AEM内容存储库的结构。
资产REST API公开对文件夹属性的访问权限;例如,其名称、标题等。 资产会作为文件夹的子实体进行显示。
根据资产类型,子实体的列表可能已包含定义相应子实体的完整属性集。 或者,在子实体的此列表中,只能为实体公开缩减的属性集。
如果请求资产,响应将返回其元数据;例如标题、名称以及由相关资产模式定义的其他信息。
资产的二进制数据会作为content
类型(也称为rel attribute
)的SIREN链接公开。
资产可以有多个演绎版。 它们通常作为子实体公开,一个例外是缩略图再现,它作为类型thumbnail
(rel="thumbnail"
)的链接公开。
内容片段是一种特殊的资产类型。 它们可用于访问结构化数据,如文本、数字、日期等。
由于standard资产(如图像或音频)存在若干差异,因此处理这些资产时会应用一些其他规则。
内容片段:
不要公开任何二进制数据。
完全包含在JSON输出中(在properties
属性中)。
也被视为原子,即元素和变量作为片段属性的一部分而暴露,而不是作为链接或子实体。 这允许有效访问片段的有效负荷。
目前,定义内容片段结构的模型不会通过HTTP API公开。 因此,使用者需要了解片段的模型(至少是最小值)-尽管大多数信息都可以从负载中推断出来;数据类型等。 是定义的一部分。
要创建新内容片段,必须提供(内部存储库)路径。
关联的内容当前未公开。
使用情况可能因您使用AEM作者环境还是发布数据以及您的特定用例而异。
创建严格绑定到作者实例(,目前没有方法使用此API复制片段以进行发布)。
投放可以从两者中实现,因为AEM仅以JSON格式提供请求的内容。
AEM云实例上的调度程序配置可能会阻止对/api
的访问。
有关详细信息,请参阅API参考。 特别是Adobe Experience Manager资产API —— 内容片段。
使用方式:
GET /{cfParentPath}/{cfName}.json
例如:
https://localhost:4502/api/assets/we-retail/en/experiences/arctic-surfing-in-lofoten.json
响应采用内容片段中的结构化内容进行序列化JSON。 引用作为引用URL提供。
可以执行两种读操作:
使用方式:
POST /{cfParentPath}/{cfName}
主体必须包含要创建的内容片段的JSON表示形式,包括应在内容片段元素上设置的任何初始内容。 必须设置cq:model
属性,并且必须指向有效的内容片段模型。 否则将导致错误。 还必须添加一个标题Content-Type
,该标题设置为application/json
。
使用方式
PUT /{cfParentPath}/{cfName}
主体必须包含要为给定内容片段更新内容的JSON表示形式。
这可以只是内容片段的标题或描述、单个元素或所有元素值和/或元数据。 必须为更新提供有效的cq:model
属性。
使用方式:
DELETE /{cfParentPath}/{cfName}
有一些限制:
无法编写和更新变量。 如果将这些变量添加到有效负荷(例如,用于更新),则将忽略它们。但是,变体将通过投放(GET
)提供。
当前不支持内容片段模型:无法读取或创建。为了能够创建新内容片段或更新现有内容片段,开发人员必须知道内容片段模型的正确路径。 目前,获取这些概述的唯一方法是通过管理UI。
引用将被忽略。当前不检查是否引用了现有内容片段。 因此,例如,删除内容片段可能会导致包含引用的页面上出现问题。
在相关情况下可以看到以下状态代码:
200(确定)
返回时间:
通过GET
请求内容片段
通过PUT
成功更新内容片段
201(已创建)
返回时间:
POST
成功创建内容片段404(未找到)
返回时间:
500(内部服务器错误)
返回此错误:
以下列表返回此错误状态时的常见情形以及生成的错误消息(等宽):
父文件夹不存在(通过POST
创建内容片段时)
未提供内容片段模型(null值),资源为null(可能是权限问题),或者资源没有有效的片段模板:
No content fragment model specified
Cannot create a resource of given model '/foo/bar/qux'
Cannot adapt the resource '/foo/bar/qux' to a content fragment template
无法创建内容片段(可能是权限问题):
Could not create content fragment
无法更新标题和描述:
Could not set value on content fragment
无法设置元数据:
Could not set metadata on content fragment
找不到或无法更新内容元素
Could not update content element
Could not update fragment data of element
详细的错误消息通常按以下方式返回:
{
"class": "core/response",
"properties": {
"path": "/api/assets/foo/bar/qux",
"location": "/api/assets/foo/bar/qux.json",
"parentLocation": "/api/assets/foo/bar.json",
"status.code": 500,
"status.message": "...{error message}.."
}
}
有关详细的API参考,请参阅此处:
有关更多信息,请参阅: