Node.js中Axios调用第三方API遇证书错误及400问题求助
问题解决步骤
先修复400 Bad Request的核心原因
你当前代码的Axios配置存在两个关键错误,这是导致400的主要原因:
- 请求头未放在
headers字段中,而是直接平级放在config对象里,Axios无法正确识别这些头信息; - 发送
multipart/form-data格式数据时,没有用FormData对象包装普通JS对象,导致数据编码不符合要求。
修正后的代码示例:
const https = require('https'); const axios = require('axios'); const FormData = require('form-data'); // 需先安装:npm install form-data // 用FormData构造符合要求的请求体 const data = new FormData(); data.append('StartTime', startDate); data.append('EndTime', endDate); // 部分ASP.NET Core接口要求Token放在请求体中,可对照Postman的请求详情调整 data.append('RequestVerificationToken', 'CfDJ8Nr2EC612OFAjHvozOYXtlRBtAUjb36TUpOhI0yuLADjcckB_h1xKJWHDwl0MrqyE4_4pU_YXUkeh5uI66UBXedMcMmihENJ5hpfW_vBgNWZJ-JtliiE4UYvxNJCvvhmGvIWSKWeeqx-llCxrPio9Tw'); const httpsAgent = new https.Agent({ rejectUnauthorized: false }); try { const response = await axios.post('https://cebcare.ceb.lk/Incognito/GetLoadSheddingEvents', data, { httpsAgent, headers: { // 所有请求头必须放在headers对象内 Cookie: '.AspNetCore.Antiforgery.ThOcTlhnrMo=CfDJ8Nr2EC612OFAjHvozOYXtlRQE9n05fuSOD0jEvKY0unmx8QyMYxdCfmotrhzVIKzurnhpkY_MtfAP9cmpR11u8rzt7_xz4IkuWMURwfelg7ymSJ8GaksLVwEgbMIkEDfrvjb5II6EzzTaLA5RiXRDXU', ...data.getHeaders() // 自动生成含boundary的Content-Type头,避免手动设置出错 } }); console.log(response.data); } catch (error) { console.error(error.response?.data || error.message); }
关键细节说明
- 请求头的正确配置:Axios的config参数中,所有请求头都必须放在
headers属性下,否则无法被正确发送到服务器; - multipart格式处理:直接传普通JS对象时,Axios不会自动编码为multipart格式,必须使用
FormData对象,并通过data.getHeaders()自动生成符合规范的Content-Type头; - Token的位置:ASP.NET Core的防伪造Token可能要求放在请求体或请求头中,可打开Postman的请求详情(查看Body和Headers)对比,调整代码中Token的放置位置。
关于Cookie和RequestVerificationToken的问题
- 能否绕过?:不能。这是ASP.NET Core内置的防跨站请求伪造(CSRF)机制,服务器会验证Cookie中的防伪造标识与请求中的Token是否匹配,缺失或不匹配会直接返回错误;
- 能否硬编码?:可以临时使用,但不推荐。这两个值与会话绑定,一段时间后会过期,过期后请求失效。更可靠的方式是先请求
https://cebcare.ceb.lk/Incognito/DemandMgmtSchedule页面,从响应Cookie和页面HTML的隐藏input中动态提取Token,再用这些值发送请求。
证书错误的补充说明
rejectUnauthorized: false是临时绕过证书验证的方案,生产环境不建议使用。若要彻底解决,可下载目标网站的根证书,配置httpsAgent使用该证书:
const fs = require('fs'); const httpsAgent = new https.Agent({ ca: fs.readFileSync('./root-certificate.pem') // 替换为你的根证书文件路径 });
内容的提问来源于stack exchange,提问作者binga58
相关产品推荐
相关产品推荐

