You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:双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缺少对应项目
  • 注意点: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:57