Personalizzazione ibrida tramite Web SDK e API server Edge Network
Panoramica overview
La personalizzazione Hybdrid descrive il processo di recupero del contenuto di personalizzazione lato server, utilizzando l'API server Edge Network, e di rendering lato client, utilizzando l'SDK Web.
È possibile utilizzare la personalizzazione ibrida con soluzioni di personalizzazione come Adobe Target, Adobe Journey Optimizer o Offer Decisioning. La differenza consiste nel contenuto del payload API server.
Prerequisiti prerequisites
Prima di implementare la personalizzazione ibrida nelle proprietà web, assicurati di soddisfare le seguenti condizioni:
- Hai deciso quale soluzione di personalizzazione desideri utilizzare. Questo avrà un impatto sul contenuto del payload dell'API server.
- Hai accesso a un server applicazioni che puoi utilizzare per effettuare le chiamate all'API server.
- Accesso a Edge Network Server API.
- Hai configurato correttamente e distribuito l'SDK Web sulle pagine che desideri personalizzare.
Diagramma di flusso flow-diagram
Il diagramma di flusso seguente descrive l’ordine dei passaggi effettuati per distribuire la personalizzazione ibrida.
- Tutti i cookie esistenti memorizzati in precedenza dal browser, con prefisso
kndctr_
, sono inclusi nella richiesta del browser. - Il browser Web client richiede la pagina Web dal server applicazioni.
- Quando il server applicazioni riceve la richiesta di pagina, invia una richiesta
POST
all'endpoint Server API Interactive Data Collection per recuperare il contenuto di personalizzazione. La richiestaPOST
contieneevent
equery
. I cookie del passaggio precedente, se disponibili, sono inclusi nell'arraymeta>state>entries
. - L’API server restituisce il contenuto di personalizzazione al server applicazioni.
- Il server applicazioni restituisce una risposta HTML al browser client, contenente cookie di identità e cluster.
- Nella pagina client viene chiamato il comando Web SDK
applyResponse
, passando le intestazioni e il corpo della risposta Server API del passaggio precedente. - Web SDK esegue automaticamente il rendering delle offerte di Target Visual Experience Composer (VEC) e degli elementi di Journey Optimizer Web Channel, perché il flag
renderDecisions
è impostato sutrue
. - Le offerte HTML/JSON basate su moduli di destinazione e le esperienze basate su codice di Journey Optimizer vengono applicate manualmente tramite il metodo
applyProposition
, per aggiornare DOM in base al contenuto di personalizzazione nella proposta. - Per le offerte HTML/JSON basate su moduli di Target e le esperienze basate su codice di Journey Optimizer, gli eventi di visualizzazione devono essere inviati manualmente, per indicare quando è stato visualizzato il contenuto restituito. Questa operazione viene eseguita tramite il comando
sendEvent
.
Cookie cookies
I cookie vengono utilizzati per rendere persistenti l’identità dell’utente e le informazioni sul cluster. Quando si utilizza un’implementazione ibrida, il server applicazioni Web gestisce l’archiviazione e l’invio di questi cookie durante il ciclo di vita della richiesta.
kndctr_AdobeOrg_identity
kndctr_AdobeOrg_cluster
Posizionamento della richiesta request-placement
Le richieste API server sono necessarie per ottenere proposte e inviare una notifica di visualizzazione. Quando si utilizza un’implementazione ibrida, il server applicazioni invia queste richieste all’API server.
implicazioni di Analytics analytics
Quando implementi la personalizzazione ibrida, devi prestare particolare attenzione in modo che gli hit pagina non vengano conteggiati più volte in Analytics.
Quando configuri uno stream di dati per Analytics, gli eventi vengono inoltrati automaticamente in modo che gli hit di pagina vengano acquisiti.
Il campione di questa implementazione utilizza due diversi flussi di dati:
- Un flusso di dati configurato per Analytics. Questo flusso di dati viene utilizzato per le interazioni Web SDK.
- Un secondo stream di dati senza una configurazione Analytics. Questo flusso di dati viene utilizzato per le richieste API server. Devi configurare questo stream di dati con la stessa configurazione di destinazione dello stream di dati configurato per Analytics.
In questo modo, la richiesta lato server non registra alcun evento Analytics, ma le richieste lato client. Questo fa sì che le richieste di Analytics vengano conteggiate con precisione.
Richiesta lato server server-side-request
La richiesta di esempio seguente illustra una richiesta API server che il server applicazioni potrebbe utilizzare per recuperare il contenuto di personalizzazione.
Formato API
POST /ee/v2/interact
Richiesta request
curl -X POST "https://edge.adobedc.net/ee/v2/interact?dataStreamId={DATASTREAM_ID}"
-H "Content-Type: text/plain"
-d '{
"event":{
"xdm":{
"web":{
"webPageDetails":{
"URL":"http://localhost/"
},
"webReferrer":{
"URL":""
}
},
"identityMap":{
"FPID":[
{
"id":"xyz",
"authenticatedState":"ambiguous",
"primary":true
}
]
},
"timestamp":"2022-06-23T22:21:00.878Z"
},
"data":{
}
},
"query":{
"identity":{
"fetch":[
"ECID"
]
},
"personalization":{
"schemas":[
"https://ns.adobe.com/personalization/default-content-item",
"https://ns.adobe.com/personalization/html-content-item",
"https://ns.adobe.com/personalization/json-content-item",
"https://ns.adobe.com/personalization/redirect-item",
"https://ns.adobe.com/personalization/dom-action"
],
"decisionScopes":[
"__view__",
"sample-json-offer"
]
}
},
"meta":{
"state":{
"domain":"localhost",
"cookiesEnabled":true,
"entries":[
{
"key":"kndctr_XXX_AdobeOrg_identity",
"value":"abc123"
},
{
"key":"kndctr_XXX_AdobeOrg_cluster",
"value":"or2"
}
]
}
}
}'
dataStreamId
String
requestId
String
Risposta lato server server-response
La risposta di esempio seguente mostra l’aspetto che potrebbe avere la risposta dell’API server.
{
"requestId":"5c539bd0-33bf-43b6-a054-2924ac58038b",
"handle":[
{
"payload":[
{
"id":"XXX",
"namespace":{
"code":"ECID"
}
}
],
"type":"identity:result"
},
{
"payload":[
{
"..."
},
{
"..."
}
],
"type":"personalization:decisions",
"eventIndex":0
}
]
}
Richiesta lato client client-request
Nella pagina client viene chiamato il comando Web SDK applyResponse
, passando le intestazioni e il corpo della risposta lato server.
alloy("applyResponse", {
"renderDecisions": true,
"responseHeaders": {
"cache-control": "no-cache, no-store, max-age=0, no-transform, private",
"connection": "close",
"content-encoding": "deflate",
"content-type": "application/json;charset=utf-8",
"date": "Mon, 11 Jul 2022 19:42:01 GMT",
"server": "jag",
"strict-transport-security": "max-age=31536000; includeSubDomains",
"transfer-encoding": "chunked",
"vary": "Origin",
"x-adobe-edge": "OR2;9",
"x-content-type-options": "nosniff",
"x-konductor": "22.6.78-BLACKOUTSERVERDOMAINS:7fa23f82",
"x-rate-limit-remaining": "599",
"x-request-id": "5c539bd0-33bf-43b6-a054-2924ac58038b",
"x-xss-protection": "1; mode=block"
},
"responseBody": {
"requestId": "5c539bd0-33bf-43b6-a054-2924ac58038b",
"handle": [
{
"payload": [
{
"id": "XXX",
"namespace": {
"code": "ECID"
}
}
],
"type": "identity:result"
},
{
"payload": [
{...},
{...}
],
"type": "personalization:decisions",
"eventIndex": 0
}
]
}
}
).then(applyPersonalization("sample-json-offer"));
Le offerte JSON basate su moduli vengono applicate manualmente tramite il metodo applyPersonalization
, per aggiornare DOM in base all'offerta di personalizzazione. Per le attività basate su moduli, gli eventi di visualizzazione devono essere inviati manualmente, per indicare quando è stata visualizzata l’offerta. Questa operazione viene eseguita tramite il comando sendEvent
.
function sendDisplayEvent(decision) {
const { id, scope, scopeDetails = {} } = decision;
alloy("sendEvent", {
"xdm": {
"eventType": "decisioning.propositionDisplay",
"_experience": {
"decisioning": {
"propositions": [{
"id": id,
"scope": scope,
"scopeDetails": scopeDetails
}],
"propositionEventType": {
"display": 1
}
}
}
}
});
}
Applicazione di esempio sample-app
Per aiutarti a sperimentare e saperne di più su questo tipo di personalizzazione, forniamo un’applicazione di esempio che puoi scaricare e utilizzare per i test. Puoi scaricare l'applicazione, insieme a istruzioni dettagliate su come utilizzarla, da questo archivio GitHub.