[Alpha]{class="badge informative"}

平台服务

服务器SDK与Web SDK共享其核心逻辑。 任何依赖于环境的内容,如发送网络请求、读取Cookie或存储数据,都会经过一组​平台服务。 SDK包括仅使用Web标准API的默认服务,因此它们可以在任何满足要求的运行时中工作。 您可以将其中任何一项替换为您自己的实施。

大多数实施不需要替换任何服务。 替换其中一个的最常见原因是要提供cookie服务,以便访客在不同的请求中保持相同的身份和同意。

传递服务的位置 where

您可以在以下两个位置传递服务:

  • createInstance (或createCustomInstance):传递具有platformServices属性的对象。 这些服务适用于顶级实例。 由forRequest创建的句柄也重复使用network、runtime、legacy和globals服务,但​不 cookie和storage服务,因为这些服务包含访客数据。
  • forRequest:直接在forRequest对象中传递request旁边的服务。 这些服务仅适用于该句柄,并且优先于传递给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