此文本已使用 Salesforce 机器翻译系统进行翻译。如需了解更多详情,请点击此处。
Managed Runtime 的代理功能允许您通过与网店相同的域将请求路由到托管在不同域上的 API。

为什么使用与您的网店相同的域?假设您的网店托管在 www.northerntrailoutfitters.com,您想从 api.commercecloud.salesforce.com请求 B2C Commerce API。在没有代理的情况下发出此请求需要额外的配置步骤,并且不如代理那样快速和可观察。让我们比较一下这两种方法:
| 无代理 | 有代理 |
|---|---|
| 您必须将 API 服务器配置为使用跨域资源共享 (CORS) 标头进行响应。 | CORS 不需要额外的配置。 |
| API 请求需要额外的预检请求,从而降低性能。 | 没有额外的网络请求。 |
| 如果 API 服务器不缓存响应,您将失去显著提高性能的机会。 | 您可以指示 Managed Runtime 的 CDN 以缓存特定请求。 |
| 如果您无权访问 API 服务器的日志,则很难衡量它如何影响整体性能。 | 所有通过代理通过 Managed Runtime 的 CDN 路由 API 请求都会被记录。 |
现在您了解了使用代理的价值,我们来探索配置代理的各种方法。
在本地开发期间,可以通过编辑 <PROJECT_DIR> 中的 mobify.ssrParameters.proxyConfigs 数组来配置代理。例如,要配置 B2C Commerce API 的代理:
1{
2 "proxyConfigs": [
3 {
4 "host": "<SHORT_CODE>.api.commercecloud.salesforce.com",
5 "path": "api"
6 }
7 ]
8}proxyConfigs 数组包含定义具有以下属性代理配置的对象:
host:接收请求的源主机。path:在请求路径中用于标识此代理的名称。要在应用程序代码中发出代理请求,请在生成请求路径时遵循以下模式:<PROXY_PATH>。
选择能够轻松识别您正在使用的 API 的代理路径。
Tip
我们来查看使用 api 作为 path 值的示例请求。默认情况下,使用 PWA Kit 创建的项目包括将 api 路径与 B2C Commerce API 相关联的代理配置。
1import { getAppOrigin } from "pwa-kit-react-sdk/utils/url";
2
3// `getAppOrigin` returns the correct origin for both local development and Managed Runtime environments.
4fetch(`${getAppOrigin()}/mobify/proxy/api/categories/bikes`);在本地开发期间更改代理配置时,您_必须_重新启动本地开发服务器才能使更改生效。
Managed Runtime 忽略配置文件中的代理设置。相反,必须使用 Runtime Admin 或 Managed Runtime API 配置代理。
要使用我们基于 Web 的管理工具为 Managed Runtime 环境配置代理,请执行以下步骤:

您还可以使用 projects_target_partial_update 端点以编程方式为 Managed Runtime 环境配置代理。Managed Runtime API 通常使用术语“目标”而不是“环境”,但两个术语指的是同一事物。
以下更新环境以包含 api 和 ocapi 路径的代理配置的示例请求:
1curl "https://cloud.mobify.com/api/projects/$PROJECT/target/$ENVIRONMENT/" \
2 --request 'PATCH' \
3 --header "Authorization: Bearer $API_KEY" \
4 --data '{
5 "ssr_proxy_configs": [
6 {
7 "host": "api.commercecloud.salesforce.com",
8 "path": "api",
9 },
10 {
11 "host": "aaaa-001.dx.commercecloud.salesforce.com",
12 "path": "ocapi"
13 }
14 ]
15 }'创建或更新环境时,JSON 请求正文从名为 ssr_proxy_configs 的字段接受代理配置对象的数组。代理配置对象包括 host 和 path, 就像在配置文件中一样。
为避免停机,在生产环境 (Production) 中添加或删除代理的步骤必须按特定顺序完成。
将代理添加到生产环境 (Production):
要从生产环境 (Production) 中移除代理:
在本地开发中,可以使用环境变量覆盖代理配置。
设置称为 SSR_PROXY1 的环境变量来覆盖 proxyConfigs 数组中的第一个元素,设置称为 SSR_PROXY2 的环境变量来覆盖第二个元素,依此类推。
工作原理:如果环境变量 SSR_PROXY1 设置为 https://api-staging.example.com/api,它将 proxyConfigs 数组中的第一个元素替换为以下代理配置对象:
1{
2 "host": "api-staging.example.com",
3 "path": "api"
4}这些环境变量通常在本地开发期间与 npm start 命令一起使用,以使用 API 主机的不同实例,例如准备环境 (Staging) 或生产环境 (Production)。这是覆盖第一个代理配置对象的示例,以便 api 路径将请求路由到准备环境 (Staging) 实例:
1SSR_PROXY1=https://api-staging.example.com/api npm start配置代理设置后,您可以使用 PWA Kit React SDK 的实用程序函数 getProxyConfigs 查找它们。例如,您可以使用不同的客户端 ID,具体取决于代码运行的环境:
1import { getProxyConfigs } from "pwa-kit-react-sdk/ssr/universal/utils.js";
2
3const HOST_TO_CLIENT_ID = {
4 "api-staging.example.com": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5 default: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
6};
7
8const CLIENT_ID = (function getClientId() {
9 const { host } = getProxyConfigs().find((c) => c.path === "api");
10 return HOST_TO_CLIENT_ID[host] || HOST_TO_CLIENT_ID["default"];
11})();代理请求时,对源的请求和来自源的响应都会被修改,以使它们透明地使用您的应用程序代码。
本节中提供的示例假定应用程序在 www.northerntrailoutfitters.com 托管并配置为将请求代理到 api.commercecloud.com.
Note
在将请求发送到主机之前,对请求进行了以下修改:
X-Mobify: true 的 HTTP 标头。代理请求转发所有查询字符串参数和标头,包括 Cookie。
在将响应发送到客户端之前,将对其应用以下修改:
X-Request-Url: <URL>的 HTTP 标头。Location 标头的 host 与代理的 host 匹配,则 host 以 <PROXY_PATH> 为前缀。Set-Cookie 标头的 domain 匹配代理的 host,则会更新这些标头以匹配。例如,Set-Cookie: key=val; domain=api.commercecloud.com更新为Set-Cookie: key=val; domain=www.northerntrailoutfitters.com。host 匹配的 Access-Control-Allow-Origin 标头,则将其更新为 Access-Control-Allow-Origin: https://www.northerntrailoutfitters.com。要测试修改,以 httpbin.org 为主机配置代理配置。当您通过该代理发出请求时,它会回显收到的任何标头。
默认情况下,代理请求不会被 CDN 缓存。此默认设置允许在您的代码中透明地使用代理请求,而不必担心不正确地缓存响应。
如果您_确实_希望 CDN 缓存代理请求,请将请求中使用的路径前缀从 proxy 更改为 caching:
缓存代理不适合与 B2C Commerce API 搭配使用。请改用其服务器端 Web 层缓存功能。
Note
缓存代理请求与标准代理请求的区别如下:
Cookie HTTP 标头被删除。缓存响应与标准响应的不同之处如下:
Set-Cookie HTTP 标头都将被删除。缓存的响应包括以下 HTTP 标头,因此当这些标头的值发生变化时,将分别缓存响应:
AcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationRange包含其他 HTTP 标头的响应在其值不同时,_不会_单独缓存。
代理与 App Server 具有不同的约束。
Cookie 标头。代理响应可以包含 Set-Cookie 标头。HEAD、GET和 OPTIONS 方法。POST 不支持请求。现在您已了解如何以及为何在您的商务应用程序中使用代理,请继续探索 PWA Kit 文档。