调用News API发起GET请求报userAgentMissing错误如何解决
问题原因
News API 服务端强制校验所有入站请求的User-Agent请求头,未携带该头的匿名请求会直接被拦截,返回HTTP 400状态码和userAgentMissing错误。Node.js 原生https模块默认不会自动填充User-Agent头,不管你调用https.get还是https.request方法,只要没手动配置该请求头,都会触发相同报错,和你用哪个原生请求方法无关。
修复方案
只需要在发起请求时,手动在请求配置里添加合法的User-Agent头即可,无需替换第三方请求库,原生模块即可正常调用。
修正后的可运行代码如下:
app.get("/", function (req, res) { const targetUrl = "https://newsapi.org/v2/top-headlines?country=in&apiKey=xxxxx"; // 构造请求配置 const requestOptions = new URL(targetUrl); requestOptions.headers = { // User-Agent值自定义即可,标注你的应用名称/版本,不要留空 'User-Agent': 'MyNewsClient/1.0' }; https.get(requestOptions, function (response) { console.log("接口响应状态码:", response.statusCode); let responseData = ''; // 流式接收响应分片,拼接完成后再解析 response.on('data', (chunk) => { responseData += chunk; }); response.on('end', () => { const parsedData = JSON.parse(responseData); console.log("接口返回内容:", parsedData); res.send(parsedData); }); }).on('error', (err) => { console.error("请求News API失败:", err); res.status(500).send("服务拉取新闻失败"); }); });
额外排查点
User-Agent字段值不要留空,也不要用过于模糊的默认标识,明确标注你的应用信息即可,服务端对值的具体格式没有强制要求。- 你原有代码存在隐藏bug:
data事件是分片触发的,接口返回内容体积较大时会分多次推送数据片段,直接对单次接收的chunk做JSON.parse会触发解析错误,必须等所有分片接收完成(监听end事件)、拼接出完整响应字符串后再做JSON解析。 - 如果添加头之后依然报错,先打印实际发出的请求头校验:在
https.get的回调里执行console.log(response.req.getHeader('user-agent')),确认UA值确实被带上,排查是否有本地代理、网关层把出站请求的UA头剔除了。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

