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

如何用Axios调用API接口,将合同对象与对应子接口数据合并?

合并主接口与子接口数据的实现方案

你可以通过并行请求子接口+数据合并的方式,让每个对象同时包含主接口(getContratos)和子接口(getItensContrato)的数据,具体实现步骤和代码如下:

核心思路

  1. 先调用PUT接口拿到主数据列表
  2. 对列表里的每个对象,并行发起对应的子接口请求
  3. 将子接口返回的数据合并到原对象中
  4. 单独处理每个子请求的异常,避免单个请求失败影响整体流程

代码实现(基于Async/Await)

async function fetchMergedContratos() {
  try {
    // 1. 获取主接口的getContratos数据
    const mainRes = await axios.put('你的主接口URL');
    const contratos = mainRes.data;

    // 2. 并行处理所有子接口请求,合并数据
    const mergedContratos = await Promise.all(
      contratos.map(async (contrato) => {
        try {
          // 调用子接口,传入当前对象的idContrato
          const subRes = await axios.get(`https://prefeitura.uberaba.mg.gov.br/GRP/portalcidadao/webservices/contratos/getItensContrato?id=${contrato.idContrato}`);
          // 合并原数据与子接口数据,新增itensContrato字段存储子数据
          return { ...contrato, itensContrato: subRes.data };
        } catch (subErr) {
          // 子请求失败时的降级处理:保留原数据,标记错误信息
          console.error(`ID ${contrato.idContrato} 的子数据加载失败:`, subErr);
          return { ...contrato, itensContrato: null, loadError: '子数据获取失败' };
        }
      })
    );

    // mergedContratos就是每个对象都包含主、子数据的最终数组
    console.log('合并完成的数据:', mergedContratos);
    return mergedContratos;
  } catch (mainErr) {
    console.error('主接口数据获取失败:', mainErr);
    throw mainErr;
  }
}

// 执行函数
fetchMergedContratos();

关键细节说明

  • 并行请求:用Promise.all同时发起所有子接口请求,比串行请求效率高很多,适合数据量不大的场景
  • 异常隔离:每个子请求单独捕获异常,不会因为某一个子接口报错导致整个合并流程中断
  • 数据合并:用扩展运算符...contrato保留原对象的所有属性,再新增字段存储子接口返回的数据,避免覆盖原数据

可选优化(应对大量数据)

如果主接口返回的对象数量很多(比如上百个),直接并行发起所有请求可能触发接口限流,可以改成分批并行请求,比如每次只处理10个对象:

// 分批处理函数
async function batchProcess(arr, batchSize) {
  const results = [];
  for (let i = 0; i < arr.length; i += batchSize) {
    const batch = arr.slice(i, i + batchSize);
    const batchResults = await Promise.all(
      batch.map(async (item) => {
        // 这里复用上面的子请求逻辑
        try {
          const subRes = await axios.get(`https://prefeitura.uberaba.mg.gov.br/GRP/portalcidadao/webservices/contratos/getItensContrato?id=${item.idContrato}`);
          return { ...item, itensContrato: subRes.data };
        } catch (subErr) {
          console.error(`ID ${item.idContrato} 子数据加载失败:`, subErr);
          return { ...item, itensContrato: null, loadError: '子数据获取失败' };
        }
      })
    );
    results.push(...batchResults);
  }
  return results;
}

// 在主函数中替换Promise.all为分批处理
async function fetchMergedContratos() {
  try {
    const mainRes = await axios.put('你的主接口URL');
    const contratos = mainRes.data;
    // 每次处理10个,可根据接口限流情况调整
    const mergedContratos = await batchProcess(contratos, 10);
    console.log('合并完成的数据:', mergedContratos);
    return mergedContratos;
  } catch (mainErr) {
    console.error('主接口数据获取失败:', mainErr);
    throw mainErr;
  }
}

内容的提问来源于stack exchange,提问作者Guilherme Vinicius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:30