Axios调用Epic Games API返回403错误,okhttp3调用正常
解决Node.js Axios调用Epic API返回403的问题
问题分析
你遇到的403错误并非CORS问题(CORS是浏览器端的跨域限制,Node服务端发起请求不受此约束),核心原因是Axios请求中添加了浏览器专属的请求头,被Epic的请求验证机制拦截。
对比可成功的请求(Postman、Java OkHttp):
- Java OkHttp使用默认请求头即可成功,未额外添加浏览器特有的头字段
- 你在Axios中额外添加了
sec-fetch-site,这个字段是浏览器发起跨域请求时自动生成的标识,服务端发起请求时不需要携带,会被识别为异常请求
解决方案
去掉不必要的请求头,仅保留必要的User-Agent即可(模拟浏览器请求),甚至可以直接使用Axios默认请求头。
修改后的Axios代码
const express = require('express'); const axios = require('axios'); const cors = require('cors'); const app = express(); app.use(cors()); app.get('/fetch-epic-api', async (req, res) => { try { const response = await axios.get('https://dev.epicgames.com/community/api/documentation/table_of_content.json?path=en-us/unreal-engine', { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' }, }); res.json(response.data); } catch (error) { console.error('API请求错误:', error); res.status(500).json({ error: '请求过程中发生错误。' }); } }); const PORT = 3000; app.listen(PORT, () => { console.log(`服务器运行在 http://localhost:${PORT}`); });
额外排查方向
如果上述修改后仍有问题,可以尝试:
- 完全移除自定义请求头,使用Axios默认请求发起请求
- 检查Axios在Node环境下默认携带的
Accept-Encoding,若包含br(Brotli压缩),可尝试指定为gzip, deflate,部分服务端对Brotli的支持可能存在验证逻辑
内容的提问来源于stack exchange,提问作者Yannic
相关产品推荐
相关产品推荐

