[Alpha]{class="badge informative"}

与服务器SDK的混合个性化

在混合个性化实施中,您的服务器请求个性化内容,而访客的浏览器会渲染该内容。 适用于JavaScript🔗的Adobe Experience Platform Server SDK或Server SDK在服务器构建页面时请求内容,并且Web SDK在浏览器中呈现内容。

与客户端个性化相比,此方法具有以下优势:

  • Personalization已提前准备就绪。 服务器在构建页面时请求建议,因此浏览器不会等待单独向Edge Network发出请求,然后才能呈现内容。
  • 闪烁更少。 由于建议已在页面中,因此浏览器可以在Web SDK加载后立即呈现这些建议。
  • 服务器也可以使用这些决策。 例如,您的服务器可以在发送页面之前根据建议选择要加载哪些产品。
NOTE
服务器SDK采用Alpha格式。 在计划实施之前,请查看支持的功能。

工作原理 how-it-works

  1. 访客的浏览器向您的服务器请求一个页面。
  2. 您的服务器使用访客的forRequest句柄上的personalization选项调用sendEvent。 结果包含访客的建议。
  3. 您的服务器包含其返回的HTML中的建议。
  4. 在浏览器中,Web SDK使用applyPropositions命令呈现建议。
  5. Web SDK会为其呈现的建议发送一个显示事件。

先决条件 prerequisites

  • 启用了Adobe Target或Adobe Journey Optimizer的数据流。 将其​ 访问类型 ​设置为​混合身份验证,因为服务器发送经过身份验证的请求,而浏览器发送未经身份验证的请求。 请参阅身份验证。
  • 服务器SDK 已安装且已配置至您的服务器。
  • 您页面上的Web SDK使用相同的orgId和datastreamId进行配置。

步骤1:在服务器上请求建议 server

当服务器处理页面请求时,请求该页面上表面或决策范围的建议。 显式设置页面URL,因为请求的Referer标头在导航期间包含​ previous ​页面。 请参阅上下文和转发的标头。

async function getPropositions(req) {
  const visitor = alloy.forRequest({ request: req });

  try {
    const { propositions = [] } = await visitor.sendEvent({
      xdm: {
        eventType: "decisioning.propositionFetch",
        web: {
          webPageDetails: {
            URL: `https://www.example.com${req.url}`
          }
        },
        identityMap: {
          Email: [{ id: "visitor@example.com", primary: true }]
        }
      },
      personalization: {
        surfaces: ["web://www.example.com/home#hero"],
        decisionScopes: ["daily-special"]
      }
    });
    return propositions;
  } catch (error) {
    // Render the default experience if personalization isn't available
    console.error("Failed to fetch propositions", error);
    return [];
  }
}

服务器SDK不呈现建议或发送显示事件。 它只返回它们。 如果请求失败,将返回空数组,以使页面仍使用其默认内容渲染。

第2步:在页面中包含建议 page

将建议序列化到您的服务器返回的HTML中。 转义<字符,以便建议中的内容不能提前关闭<script>元素。

const propositions = await getPropositions(req);
const serialized = JSON.stringify(propositions).replace(/</g, "\\u003c");

res.end(`<!DOCTYPE html>
<html>
  <head>
    <script>window.serverPropositions = ${serialized};</script>
    <!-- Web SDK base code and library -->
  </head>
  <body>
    <div id="hero">Default hero content</div>
    <div id="daily-special">Default special</div>
  </body>
</html>`);

步骤3:在浏览器中呈现建议 browser

在页面上配置Web SDK后,将建议传递给applyPropositions。 对于不包含选择器的HTML选件,使用metadata告知Web SDK每个选件的放置位置。 请参阅呈现HTML选件。

alloy("applyPropositions", {
  propositions: window.serverPropositions || [],
  metadata: {
    "daily-special": { selector: "#daily-special", actionType: "setHtml" }
  }
}).then(({ propositions: renderedPropositions = [] }) => {
  if (!renderedPropositions.length) { return; }
  return alloy("sendEvent", {
    xdm: {
      eventType: "decisioning.propositionDisplay",
      _experience: {
        decisioning: {
          propositions: renderedPropositions.map(({ id, scope, scopeDetails }) => ({
            id,
            scope,
            scopeDetails
          })),
          propositionEventType: { display: 1 }
        }
      }
    }
  });
});

applyPropositions不会自行发送显示事件。 第二个sendEvent调用记录访客查看的建议。 请参阅管理显示事件。

保持访客身份一致 identity

为了进行准确的报告和个性化,服务器和浏览器必须以相同的方式识别访客:

  • 主标识: Server SDK发送的每个事件都必须在xdm.identityMap中包含主标识。 请参阅包含主标识。
  • ECID: Web SDK将访客的ECID存储在kndctr_<orgId>_identity Cookie中。 只有当服务器SDK可以通过您传递给forRequest的Cookie服务读取该Cookie时,它才会使用相同的ECID。 否则,服务器和浏览器会为同一访客使用不同的ECID。 查看实例和请求。

服务器SDK不包含读取访客请求Cookie的Cookie服务。 有关Cookie服务必须实现的接口,请参阅平台服务。

recommendation-more-help
experience-platform-help-collection