如何用Axios调用API接口,将合同对象与对应子接口数据合并?
合并主接口与子接口数据的实现方案
你可以通过并行请求子接口+数据合并的方式,让每个对象同时包含主接口(getContratos)和子接口(getItensContrato)的数据,具体实现步骤和代码如下:
核心思路
- 先调用PUT接口拿到主数据列表
- 对列表里的每个对象,并行发起对应的子接口请求
- 将子接口返回的数据合并到原对象中
- 单独处理每个子请求的异常,避免单个请求失败影响整体流程
代码实现(基于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
相关产品推荐
相关产品推荐

