You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:33