NodeJS调用第三方API返回301状态码且无数据,如何排查问题?
解决Node.js http.request调用API返回301的问题
问题原因
- 协议不匹配:你实际要调用的是HTTPS协议接口,但代码使用
http模块发起请求,HTTP请求访问HTTPS服务会触发重定向或报错。 - 原域名重定向:代码中填写的
www.zenquotes.io本身存在永久重定向规则,导致返回301状态码。
修复方案
1. 切换到正确的API并使用HTTPS模块
因为目标接口是HTTPS协议,需引入https模块替代http模块发送请求,同时更新请求参数到正确的目标API:
const http = require('http') const https = require('https') // 引入HTTPS模块 const server = http.createServer() const fs = require('fs') const indexFile = fs.readFileSync(`${__dirname}/index.html`, 'utf-8') let port = '8006' server.on('request', (request, response) => { if (request.url == '/') { // 更新为目标API的配置 const options = { hostname: 'dummyjson.com', path: '/quotes', method: 'GET' } // 使用https.request发送请求 const apiRequest = https.request(options, (apiResponse) => { let apiData = '' apiResponse.on('data', (chunk) => { apiData += chunk }) apiResponse.on('end', () => { // 匹配API返回的JSON格式设置响应头 response.writeHead(apiResponse.statusCode, { 'Content-Type': 'application/json' }); response.write(apiData) console.log(apiData) response.end() }) }) apiRequest.on('error', (err) => { response.statusCode = 500 response.writeHead(response.statusCode, { 'Content-Type': 'application/json' }); response.write(JSON.stringify({ error: `Internal Server Error. ${err.message}` })) response.end() }) apiRequest.end() } else { response.statusCode = 404; response.writeHead(response.statusCode, { 'Content-Type': 'application/json' }); response.write(JSON.stringify({ error: 'Not Found.' })) response.end() } }) server.listen(port, '127.0.0.1', () => { console.log(`Server running on http://127.0.0.1:${port}`) })
2. 通用重定向处理方案(若需保留原域名)
如果遇到301/302重定向,可在响应回调中自动跟随跳转:
const apiRequest = http.request(options, (apiResponse) => { // 检测重定向状态码 if ([301, 302].includes(apiResponse.statusCode)) { const redirectUrl = apiResponse.headers.location; const redirectUrlObj = new URL(redirectUrl); // 重新发起请求到重定向目标 const newRequest = http.request({ hostname: redirectUrlObj.hostname, path: redirectUrlObj.pathname + redirectUrlObj.search, method: 'GET' }, (newResponse) => { let apiData = ''; newResponse.on('data', chunk => apiData += chunk); newResponse.on('end', () => { response.writeHead(newResponse.statusCode, { 'Content-Type': 'application/json' }); response.write(apiData); response.end(); }); }); newRequest.end(); return; } // 原有数据处理逻辑 let apiData = ''; apiResponse.on('data', chunk => apiData += chunk); apiResponse.on('end', () => { response.writeHead(apiResponse.statusCode, { 'Content-Type': 'application/json' }); response.write(apiData); response.end(); }); })
额外优化建议
- 响应头的
Content-Type需与API返回内容格式匹配,目标API返回JSON,设置为application/json更规范。 - 错误返回采用JSON格式,保证前后端交互的一致性。
内容的提问来源于stack exchange,提问作者Atish
相关产品推荐
相关产品推荐

