通常,在实施项目时,您在AEM和Adobe Campaign中都拥有自定义代码。 通过使用现有API,您可以在Adobe Campaign中从AEM或从AEM到Adobe Campaign调用自定义代码。 本文档介绍了如何执行此操作。
您需要安装以下组件:
参见 将AEM与Adobe Campaign 6.1集成 了解更多信息。
AEM和Campaign之间的标准集成基于JSON和JSSP (JavaScript Server Page)。 这些JSSP文件可在Campaign控制台中找到,并且全部以开头 amc (Adobe Marketing Cloud)。
对于此示例,请参阅Geometrixx,该页面可从包共享中获取。
在此示例中,我们创建一个新的自定义JSSP文件,并从AEM端调用该文件以检索结果。 例如,这可用于从Adobe Campaign检索数据,或将数据保存到Adobe Campaign中。
在Adobe Campaign中,要创建新的JSSP文件,请单击 新 图标。
输入此JSSP文件的名称。 在此示例中,我们使用 cus:custom.jssp (这意味着它将位于 cus 命名空间)。
将以下代码放入jssp-file中:
<%
var origin = request.getParameter("origin");
document.write("Hello from Adobe Campaign, origin : " + origin);
%>
保存您所做的工作。 剩余的工作在AEM中。
在AEM端创建一个简单的servlet以调用此JSSP。 在本示例中,我们假定:
此示例中最重要的对象是 GenericCampaignConnector,允许您在Adobe Campaign端调用(获取和发布)jssp文件。
以下是一个小的代码片段:
@Reference
private GenericCampaignConnector campaignConnector;
...
Map<String, String> params = new HashMap<String, String>();
params.put("origin", "AEM");
CallResults results = campaignConnector.callGeneric("/jssp/cus/custom.jssp", params, credentials);
return results.bodyAsString();
如本示例所示,您需要将凭据传递到调用中。 您可以通过getCredentials()方法获取此项,其中传递的页面配置了Campaign云服务。
// page containing the cloudservice for Adobe Campaign
Configuration config = campaignConnector.getWebserviceConfig(page.getContentResource().getParent());
CampaignCredentials credentials = campaignConnector.retrieveCredentials(config);
完整的代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.mcm.campaign.CallResults;
import com.day.cq.mcm.campaign.CampaignCredentials;
import com.day.cq.mcm.campaign.GenericCampaignConnector;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.PageManagerFactory;
import com.day.cq.wcm.webservicesupport.Configuration;
@SlingServlet(paths="/bin/campaign", methods="GET")
public class CustomServlet extends SlingSafeMethodsServlet {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Reference
private GenericCampaignConnector campaignConnector;
@Reference
private PageManagerFactory pageManagerFactory;
@Override
protected void doGet(SlingHttpServletRequest request,
SlingHttpServletResponse response) throws ServletException,
IOException {
PageManager pm = pageManagerFactory.getPageManager(request.getResourceResolver());
Page page = pm.getPage("/content/geometrixx-outdoors");
String result = null;
if ( page != null) {
result = callCustomFunction(page);
}
if ( result != null ) {
PrintWriter pw = response.getWriter();
pw.print(result);
}
}
private String callCustomFunction(Page page ) {
try {
Configuration config = campaignConnector.getWebserviceConfig(page.getContentResource().getParent());
CampaignCredentials credentials = campaignConnector.retrieveCredentials(config);
Map<String, String> params = new HashMap<String, String>();
params.put("origin", "AEM");
CallResults results = campaignConnector.callGeneric("/jssp/cus/custom.jssp", params, credentials);
return results.bodyAsString();
} catch (Exception e ) {
log.error("Something went wrong during the connection", e);
}
return null;
}
}
AEM提供现成的API,用于检索siteadmin explorer视图中任何位置可用的对象。
对于此示例,请参阅Geometrixx,该页面可从包共享中获取。
对于资源管理器中的每个节点,都有一个API链接到该节点。 例如,对于节点:
API是:
URL的结尾 .1.json 可替换为 .2.json, .3.json,根据您感兴趣的子级别数量获取所有子级别的关键字 无限 可以使用:
现在,要使用API,我们必须知道,AEM默认使用基本身份验证。
名为的JS库 amcIntegration.js 在6.1.1(内部版本8624及更高版本)中提供,该版本会在多个其他版本中实施该逻辑。
loadLibrary("nms:amcIntegration.js");
var cmsAccountId = sqlGetInt("select iExtAccountId from NmsExtAccount where sName=$(sz)","aemInstance")
var cmsAccount = nms.extAccount.load(String(cmsAccountId));
var cmsServer = cmsAccount.server;
var request = new HttpClientRequest(cmsServer+"/content/campaigns/geometrixx.infinity.json")
aemAddBasicAuthentication(cmsAccount, request);
request.method = "GET"
request.header["Content-Type"] = "application/json; charset=UTF-8";
request.execute();
var response = request.response;