[Alpha]{class="badge informative"}
Personnalisation hybride avec le SDK du serveur
Dans une implémentation de personnalisation hybride, votre serveur demande du contenu personnalisé et le navigateur du visiteur le restitue. Le Adobe Experience Platform Server SDK for JavaScript ou Server SDK, demande le contenu pendant que votre serveur crée la page, et le Web SDK le rend dans le navigateur.
Par rapport à la personnalisation côté client, cette approche présente les avantages suivants :
- Personalization est prêt plus tôt. Le serveur demande des propositions lors de la création de la page, de sorte que le navigateur n’attend pas une autre demande à Edge Network avant de pouvoir effectuer le rendu du contenu.
- Moins de scintillement. Les propositions se trouvant déjà dans la page, le navigateur peut en effectuer le rendu dès que le SDK Web se charge.
- Le serveur peut également utiliser les décisions. Par exemple, votre serveur peut choisir les produits à charger en fonction d’une proposition avant d’envoyer la page.
Fonctionnement how-it-works
- Le navigateur du visiteur demande une page à votre serveur.
- Votre serveur appelle
sendEventavec l’optionpersonalizationsur le handle deforRequestdu visiteur. Le résultat contient les propositions du visiteur. - Votre serveur inclut les propositions dans l’HTML qu’il renvoie.
- Dans le navigateur, le Web SDK effectue le rendu des propositions avec la commande
applyPropositions. - Le SDK Web envoie un événement d’affichage pour les propositions qu’il a rendues.
Conditions préalables prerequisites
- Un flux de données avec Adobe Target ou Adobe Journey Optimizer activé. Définissez son Type d’accès sur Authentification mixte, car le serveur envoie des requêtes authentifiées et le navigateur envoie des requêtes non authentifiées. Voir Authentification.
- Le SDK de serveur, installé et configuré sur votre serveur.
- Le SDK Web de vos pages, configuré avec les mêmes
orgIdetdatastreamId.
Etape 1 : demande de propositions sur le serveur server
Lorsque votre serveur gère une requête de page, demandez des propositions pour les surfaces ou les portées de décision de cette page. Définissez explicitement l’URL de la page, car l’en-tête de Referer de la requête contient la page précédente lors d’une navigation. Voir En-têtes contextuels et transférés.
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 [];
}
}
Le SDK du serveur ne génère pas de propositions ni n’envoie d’événements d’affichage. Il ne les renvoie que. Si la requête échoue, renvoyez un tableau vide afin que votre page soit toujours rendue avec son contenu par défaut.
Étape 2 : inclure les propositions dans la page page
Sérialisez les propositions dans l’HTML que votre serveur renvoie. Utilisez une séquence d’échappement pour le caractère <, de sorte que le contenu d’une proposition ne puisse pas fermer l’élément de <script> plus tôt.
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>`);
Étape 3 : Effectuer le rendu des propositions dans le navigateur browser
Une fois le SDK Web configuré sur la page, transmettez les propositions à applyPropositions. Pour les offres HTML qui n’incluent pas de sélecteur, utilisez metadata pour indiquer au SDK Web où placer chacun d’eux. Voir Rendu des offres 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 n’envoie pas d’événements d’affichage seul. Le deuxième appel sendEvent enregistre les propositions que le visiteur a vues. Voir Gestion des événements d’affichage.
Assurer la cohérence de l’identité du visiteur identity
Pour des rapports et une personnalisation précis, le serveur et le navigateur doivent identifier le visiteur de la même manière :
- Identité de Principal : chaque événement envoyé par le Server SDK doit inclure une identité principale dans
xdm.identityMap. Voir Inclure une identité principale. - ECID : le SDK Web stocke l’ECID du visiteur dans le cookie
kndctr_<orgId>_identity. Le SDK du serveur n’utilise le même ECID que s’il peut lire ce cookie via le service de cookie que vous transmettez àforRequest. Sinon, le serveur et le navigateur utilisent des ECID différents pour le même visiteur. Voir Instances et requêtes .
Le SDK du serveur n’inclut pas de service de cookies qui lit les cookies de requête du visiteur. Voir Services Platform pour l’interface qu’un service de cookies doit implémenter.