通过 Shopify Flow 发起一个 HTTP 请求
为什么要在 HTTP 请求中使用这个
Shopify Flow 该功能包含一个内置的**“发送 HTTP 请求**”操作,但仅在某些 Shopify 套餐中可用。如果您的商店使用的是**“基础版**”,您仍可通过使用 Workflow Transactional Email 来调用外部 API。
您只需在应用中创建一次请求,然后在工作流程中通过“HTTP 请求”操作选择该请求。将请求保存在应用中而非工作流程中,也意味着凭据绝不会保存在您的 Shopify Flow 配置中,而且您还能免费获得完整的请求和响应日志。
你将构建的内容
一个每10分钟运行一次的工作流程,用于查找尚未导入Airtable的产品,并将它们导入其中。
此处使用:
- 保存 Airtable 令牌和基础 ID 的秘诀
- HTTP 请求:用于定义请求模板
- Shopify Flow 中的**“HTTP 请求**”操作,用于运行该操作
- 历史记录,用于查看结果
视频指南
整个设置过程:创建密钥、HTTP请求以及工作流程。该视频没有声音。
开始之前
- Workflow Transactional Email 已安装。
- 您可以访问 Shopify Flow。
- 您已拥有一个 Airtable 数据库 ID 和一个用于接收产品数据的表。
- 您拥有一个具有相应权限的 Airtable 访问令牌。
步骤 1:将凭据作为密钥存储
与其在请求中直接输入凭据,不如将它们作为密钥保存一次,然后通过 {{ secrets.yourKeyName }} 引用。这些凭据在静止状态下经过加密,可在不同请求中重复使用,并且不会保存在您的操作记录中。
打开**“秘密**”并点击**“创建秘密**”。

输入键、值和描述,然后保存。

此示例存储了两个密钥:个人访问令牌和 Airtable 数据库 ID。
步骤 2:创建请求
此示例使用了Airtable的create-records端点。
打开**“HTTP 请求**”,然后单击**“创建请求**”。

为其指定一个清晰的名称,例如“创建 Airtable 产品记录” - - 这是你稍后在 Shopify Flow 中查找时会使用的名称。
设置请求方法。若要创建 Airtable 记录,应使用 POST 方法。
在 URL 字段中输入端点。https:// 这个前缀是固定的,因此只需输入其余部分:
api.airtable.com/v0/{{ secrets.airTableProductsBaseId }}/Products
此图展示了 Airtable 端点与您的数据库的映射关系,您可以根据自身情况进行调整:
数据库
添加 Airtable 所需的表头:
Authorization: Bearer {{ secrets.airtableAccessToken }}
Content-Type: application/json
在请求正文中,请使用一个变量来存储记录,以便 Shopify Flow 能够提供这些记录:
{
"records": {{ variables.records }}
}
Airtable 预计该变量将解析为如下形式的数组:
"records": [
{
"fields": {
"Title": "Classic White T-Shirt",
"Handle": "classic-white-tshirt",
"Product ID": 1001
}
},
{
"fields": {
"Title": "Eco-Friendly Water Bottle",
"Handle": "eco-water-bottle",
"Product ID": 1002
}
}
]
我们将在下一步的工作流程中构建该数组。
最终生成的请求如下所示:



保存该请求。现在,在Shopify Flow中的**“HTTP 请求**”操作中,该请求已可供选择。
第 3 步:构建工作流程
打开 Shopify Flow 并创建一个新的工作流程。
选择基于计划的触发器。本示例为演示目的,每10分钟运行一次 - - 在生产环境中请选择一个合理的间隔。

检索尚未导入 Airtable 的产品。已发送的产品在最后一步会被标记为added-to-airtable,因此此查询会将其排除在外。请参阅 Shopify 上的 查询参数参考文档。

现在对数据进行格式化。请求正文需要一个records变量,因此请使用Shopify Flow的**“运行代码**”操作,将获取到的商品数据转换为该数组。

请按以下方式配置该步骤:

查询:
query {
getProductData {
id
handle
title
}
}
代码:
export default function main(input) {
const records = input.getProductData.map((data) => {
const numericId = parseInt(data.id.replace("gid://shopify/Product/", ""));
return {
fields: {
"Product ID": numericId,
"Title": data.title,
"Handle": data.handle
}
};
});
return {
records: JSON.stringify(records)
};
}
输出模式:
"The output of Run Code"
type Output {
"The message returned by the script"
records: String
}
您可以在右侧预览结果:

添加该应用提供的**“HTTP 请求**”操作。

出现提示时,请选择您保存的请求 - - “创建 Airtable 产品记录” - - 然后保存并返回工作流程。

在该操作的“变量”字段中,传入您刚刚格式化的记录:
{
"records": "{{runCode.records}}"
}

最后,遍历已获取的商品,并为它们添加added-to-airtable标签,这样下次运行时就不会再次获取这些商品了。
后对产品进行标签
保存并启用该工作流程。
第 4 步:确认是否成功
在**“历史记录**”中,您可以查看请求是否成功,以及 Airtable 返回了什么内容。
的历史记录列表
打开该条目以查看请求数据、响应数据和时间信息。

在请求的编辑页面中,点击**“请求历史**记录”按钮,系统会直接跳转到按该请求筛选后的历史记录页面。
该应用不允许您拨打哪些电话
由商家配置的请求会经过安全防护机制。针对内部或私有网络地址的请求将被拒绝,包括 localhost、云元数据端点以及任何解析为私有地址范围的地址 - - 即使是通过重定向访问的也不例外。如果您看到提及 SSRF blocked 的错误,则该目标地址就在该列表中。 此外,请求最多允许 5 次重定向,且响应大小上限为 10 MB。
Shopify Flow 该功能本身将操作响应的大小限制在 50 KB 以内。如果测试响应超过此限制,应用程序会阻止保存操作,而不是让该步骤在实时工作流程中失败。
最佳实践
- 请使用清晰的请求名称,以便在Shopify Flow中轻松查找。
- 请将 API 密钥作为机密信息存储,而不是将其直接写入请求头中。
- 让身体专注于目的地真正需要的领域。
- 每次修改后,请检查历史记录,以确认请求是否仍能成功。
- 在请求前添加一个条件,以防止其在空周期中运行。

