[Alpha]{class="badge informative"}

平台服務

伺服器SDK與Web SDK共用其核心邏輯。 任何依賴環境的專案,例如傳送網路要求、讀取Cookie或儲存資料,都會經過一組​平台服務。 SDK包含僅使用Web標準API的預設服務,因此可在符合需求的任何執行階段中運作。 您可以使用自己的實施作業來取代任何變數。

大部分實作不需要取代任何服務。 取代其中一個的最常見原因是要提供cookie服務,讓訪客在不同的請求中保持相同的身分和同意。

傳遞服務的位置 where

您可在兩個位置傳遞服務:

  • createInstance (或createCustomInstance):傳遞具有platformServices屬性的物件。 這些服務會套用至最上層執行處理。 forRequest建立的控制代碼也會重複使用network、runtime、legacy和globals服務,但​不會 cookie和storage服務,因為這些服務包含訪客資料。
  • forRequest:直接在request旁的forRequest物件中傳遞服務。 這些服務僅套用至該控制代碼,且優先於傳遞至createInstance的服務。
import { createInstance } from "@adobe/alloy-node";

// Applies to the top-level instance. Handles reuse network, runtime, legacy, and globals.
const alloy = createInstance({
  platformServices: {
    runtime: myRuntimeService
  }
});

await alloy.configure({
  datastreamId: "ebebf826-a01f-4458-8cec-ef61de241c93",
  orgId: "ADB3LETTERSANDNUMBERS@AdobeOrg",
  edgeCredentials: {
    clientId: process.env.ADOBE_CLIENT_ID,
    clientSecret: process.env.ADOBE_CLIENT_SECRET,
    scopes: process.env.ADOBE_SCOPES.split(",")
  }
});

// Applies only to this handle
const visitor = alloy.forRequest({
  request: req,
  cookie: myCookieServiceForThisVisitor,
  storage: myStorageServiceForThisVisitor
});

每個服務的介面定義於GitHub上adobe/alloy存放庫中的packages/core/src/services/types.ts。 當您取代服務時,您的實作必須在介面中提供所有方法。

可用的服務 services

服務
預設行為
傳遞至createInstance時的範圍
cookie
在記憶體中儲存Cookie。
僅頂層執行個體
storage
將資料儲存在記憶體中。
僅頂層執行個體
network
使用全域fetch函式傳送要求並轉寄訪客的標頭。
頂層執行個體和每個控制代碼
runtime
使用全域setTimeout、clearTimeout、atob、btoa、TextEncoder、TextDecoder和Date.now函式。
頂層執行個體和每個控制代碼
legacy
不執行任何動作。 在瀏覽器中,此服務會連線至伺服器上不存在的舊版訪客ID服務程式庫。
頂層執行個體和每個控制代碼
globals
傳回空值。 在瀏覽器中,此服務會讀取頁面詳細資訊,例如頁面URL。
頂層執行個體和每個控制代碼

SDK會將每位訪客的身分識別(ECID)和同意偏好設定儲存在Cookie中。 在伺服器上,它會透過cookie服務讀取及寫入這些Cookie。 Cookie服務必須提供下列方法:

方法
說明
get(name)
傳回已命名Cookie的值,或如果不存在,則傳回undefined。
getAll()
傳回包含每個Cookie名稱和值的物件。
set(name, value, options)
建立或更新Cookie。
remove(name, options)
刪除Cookie。
withConverter(converter)
傳回使用指定轉換器編碼和解碼值的Cookie服務。

預設Cookie服務僅會將Cookie保留在記憶體中:

  • 在不含cookie服務的forRequest控制代碼上,每個要求的存放區一開始是空的,因此訪客的每個要求都會獲得新的ECID。
  • 在頂層執行個體上,一個存放區會在流程的生命週期中持續,並由該執行個體上發出的每次呼叫共用。

SDK不包含讀取訪客的Cookie請求標題並寫入Set-Cookie回應標題的Cookie服務。 若要跨要求保留訪客的身分和同意,您必須提供自己的實作,並為每個要求傳遞新實作至forRequest。

儲存服務 storage

SDK會使用storage服務記住一些值,例如是否透過setDebug開啟偵錯、已傳送同意偏好設定setConsent以及Adobe Experience Platform Assurance用來驗證請求的使用者端ID。 預設儲存服務會將資料保留在記憶體中。

除非您傳遞儲存服務,否則每個forRequest控制代碼都會取得新的空白儲存服務。 如果您使用Assurance且希望訪客的Assurance使用者端ID在請求間保持相同,請將該訪客的storage服務傳遞給forRequest。

網路服務 network

預設網路服務會使用全域fetch函式傳送要求。 當您將request傳遞至forRequest時,它也會將訪客的標頭新增至每個請求。 請參閱內容與轉送的標頭。

若要取代網路服務,請傳遞接收SDK的記錄器並傳回網路服務的​函式,而不是傳遞服務物件本身:

const alloy = createInstance({
  platformServices: {
    network: (logger) => myNetworkService
  }
});
IMPORTANT
如果您取代網路服務,SDK將不再轉寄您傳遞至forRequest的request中的訪客標題。 您的網路服務必須負責傳送任何標頭。
SDK使用包含已驗證請求的Authorization、x-api-key和x-gw-ims-org-id標頭的headers物件呼叫您服務的sendFetchRequest(url, body, headers)方法。 一律傳送這些標頭。 否則,Edge Network會拒絕sendEvent要求。
recommendation-more-help
experience-platform-help-collection