[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时的范围runtimesetTimeout、clearTimeout、atob、btoa、TextEncoder、TextDecoder和Date.now函数。legacyglobalsCookie服务 cookie
SDK会将每个访客的身份(ECID)和同意首选项存储在Cookie中。 在服务器上,它通过cookie服务读取和写入这些Cookie。 Cookie服务必须提供以下方法:
get(name)undefined。getAll()set(name, value, options)remove(name, options)withConverter(converter)默认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
}
});
forRequest的request中的访客标头。 您的网络服务负责发送任何标头。Authorization、x-api-key和x-gw-ims-org-id标头的headers对象调用服务的sendFetchRequest(url, body, headers)方法。 始终发送这些标头。 否则,Edge Network将拒绝sendEvent请求。