如何将存在参数依赖的两个API调用Action合并为单个Action
问题解答
该需求完全可以实现,两种实现方式都可正常运行,你可以根据自身开发成本选择方案:
- 方案1:无需修改后端,直接在当前Action的
then方法内链式调用第二个API即可,开发成本最低,是优先推荐的方案 - 方案2:后端封装两个接口为单个接口,适合多端复用该业务流程的场景
方案1具体实现步骤
Zapier 自定义Action原生支持在单个执行逻辑内发起多次z.request请求,完全符合平台规范,没有使用限制。
你只需要按以下逻辑修改代码即可:
- 先调用创建发票的API,拿到返回的
INVOICE_ID - 在第一个请求的
then回调内调用发票确认API,传入上一步拿到的ID - 确认完成后按需获取PDF文件内容/地址,最终返回结果
修改后的参考代码如下:
// 第一步:调用创建发票接口 const createInvoiceOptions = { url: 'https://my.fastbill.com/api/1.0/api.php', method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: { 'SERVICE': 'invoice.create', // 替换为你实际创建发票的服务标识 'DATA' : bundle.inputData // 传入创建发票需要的入参 } } return z.request(createInvoiceOptions) .then((createResponse) => { createResponse.throwForStatus(); const invoiceId = createResponse.json.INVOICE_ID; // 从创建接口返回值中提取发票ID // 第二步:调用发票确认接口 const completeInvoiceOptions = { url: 'https://my.fastbill.com/api/1.0/api.php', method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: { 'SERVICE': 'invoice.complete', 'DATA' : { 'INVOICE_ID': invoiceId } } } return z.request(completeInvoiceOptions) }) .then((completeResponse) => { completeResponse.throwForStatus(); const results = completeResponse.json; // 如果需要下载PDF可以在此处追加调用获取PDF的接口逻辑 return results; });
方案2注意事项
如果你的业务中多个场景都需要用到「创建+确认发票」的流程,可以选择后端封装为单个API,优势是后续前端侧不需要重复写链式调用逻辑,统一维护业务规则;缺点是需要额外投入后端开发资源,如果你仅在Zapier中使用该流程,不需要选择该方案。
额外注意事项
- 错误处理:两个请求任意一个返回错误状态码,
throwForStatus()都会直接抛出异常,Zapier会自动标记该Action执行失败,符合业务预期 - 超时限制:Zapier自定义Action的最长执行时间为30秒,只要两个API的总响应时长不超过该限制即可正常运行
内容的提问来源于stack exchange,提问作者Furqan S. Mahmoud
相关产品推荐
相关产品推荐

