技术问询:双API数据获取、对比及提交布尔值与通知实现
结合你描述的需求,我把这个项目的实现流程拆解成清晰的三步,附上具体逻辑和代码示例(以JavaScript为例,你可以根据自身技术栈调整):
项目实现完整流程
第一步:从API1获取ID并存储到数组
- 核心逻辑:调用API1接口,解析响应数据,提取所有目标ID字段存入数组。
- 注意点:如果API1返回分页数据,要额外处理分页遍历,确保拿到全部ID;务必做好异常捕获,避免单个请求失败导致整个流程中断。
- 代码示例:
async function fetchIdsFromAPI1() { try { const response = await fetch('https://your-api1-domain/ids-endpoint'); if (!response.ok) throw new Error(`API1请求失败:${response.status}`); const data = await response.json(); // 假设API1返回的是包含id字段的对象数组 const idArray = data.map(item => item.id); console.log(`从API1成功获取${idArray.length}个ID`); return idArray; } catch (error) { console.error('获取ID失败:', error); throw error; // 可根据需求选择是否中断流程 } }
第二步:遍历ID数组,调用API2生成结果数组
- 核心逻辑:对每个ID发起API2的GET请求,根据响应判断项目是否存在:存在则保留ID,不存在则存入标记值"N"。
- 注意点:API2的请求异常(超时、服务器错误等)也需视为"不存在",存入"N";如果API2有并发限制,建议加入请求延迟或分批处理。
- 代码示例:
async function generateResultArray(idArray) { const resultArray = []; for (const id of idArray) { try { const response = await fetch(`https://your-api2-domain/check-item?id=${id}`); resultArray.push(response.ok ? id : "N"); } catch (error) { console.error(`处理ID ${id}时请求API2失败:`, error); resultArray.push("N"); } // 若API2有并发限制,可添加延迟避免触发限流 // await new Promise(resolve => setTimeout(resolve, 150)); } console.log('结果数组生成完成:', resultArray); return resultArray; }
第三步:遍历结果数组,执行POST请求或邮件通知
- 核心逻辑:分两种情况处理数组元素:
- 元素不为"N"时,向API1提交
checked: true的POST请求 - 元素为"N"时,发送邮件告知API2缺少对应项目
- 元素不为"N"时,向API1提交
- 注意点:POST请求建议加入重试机制,避免网络波动导致提交失败;邮件发送要确保SMTP服务配置正确。
- 代码示例:
// 封装邮件发送函数(以nodemailer为例) async function sendMissingItemEmail() { const transporter = require('nodemailer').createTransport({ host: 'your-smtp-host', port: 587, auth: { user: 'your-account@example.com', pass: 'your-password' } }); await transporter.sendMail({ from: '系统通知 <your-account@example.com>', to: 'admin@example.com', subject: 'API2项目缺失告警', text: '存在ID对应的项目在API2中未找到,请及时核查处理' }); } async function processResultArray(resultArray) { for (const item of resultArray) { if (item !== "N") { try { const response = await fetch('https://your-api1-domain/update-status', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: item, checked: true }) }); if (!response.ok) throw new Error(`提交ID ${item}失败:${response.status}`); console.log(`成功更新ID ${item}的checked状态`); } catch (error) { console.error(`提交ID ${item}失败:`, error); // 可加入重试逻辑,比如失败后重试2次 } } else { try { await sendMissingItemEmail(); console.log('已发送缺失项目通知邮件'); } catch (error) { console.error('发送通知邮件失败:', error); } } } }
整体流程串联
把上述函数整合起来,启动完整流程:
async function runEntireProcess() { try { const idArray = await fetchIdsFromAPI1(); const resultArray = await generateResultArray(idArray); await processResultArray(resultArray); console.log('项目全流程执行完成'); } catch (error) { console.error('项目流程执行中断:', error); } } // 启动流程 runEntireProcess();
额外优化建议
- 并发控制:如果ID数量庞大,第二步的请求可以用
Promise.all结合分批处理,提升效率,但要严格遵守API的并发限制。 - 日志与监控:添加详细的日志记录(比如每个ID的处理状态),方便后续排查问题;可接入监控告警,当邮件发送或API请求多次失败时触发通知。
- 数据持久化:如果流程可能中途中断,可将中间结果(如idArray、resultArray)存入数据库或本地文件,避免重复执行API请求。
内容的提问来源于stack exchange,提问作者Zach Mason
相关产品推荐
相关产品推荐

