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

Axios.get请求返回不稳定,Fetch却正常?Django Channels场景求助

问题分析与解决方案

核心原因分析

Axios 和 Fetch 对 HTTP 响应的校验逻辑存在差异:Fetch 对不严格符合规范的响应兼容性更强,而 Axios 要求响应完全符合 HTTP 标准才能触发回调。你用 Django Channels 手动构建响应时,缺少了让 Axios 识别响应完成的关键标记,导致它一直等待后续数据,表现为请求不稳定。

具体修复步骤

1. 修复前端 Axios 代码的语法错误

你提供的代码里存在括号写错的问题,这可能导致部分请求异常,同时建议用 try/catch 捕获错误便于排查:

async function subscribeToAnalysis (analysisId) {
    try {
        const response = await axios.get('http://localhost:8000/someEndpoint/', {
            timeout: 50000,
        });
        console.log("Response", response);
        // 后续业务逻辑和递归调用
    } catch (err) {
        console.error("请求失败:", err);
        // 可根据需求添加重试逻辑
    }
}

注:尽量避免同时混用 await 和 .then(),代码可读性和错误处理会更清晰。

2. 后端添加 Content-Length 响应头

Axios 需要明确知道响应体的长度,才能判断数据是否接收完整。手动计算响应体字节数并添加到响应头:

import json

# 先构建响应体并计算长度
analysis_data_json = json.dumps(analysisData)
response_body = bytes(analysis_data_json, 'utf-8')
content_length = str(len(response_body)).encode('utf-8')

await self.send_headers(headers=[
    (b"Content-type", b"application/json"),
    (b"Access-Control-Allow-Origin", b"*"),
    (b"Allow", b"GET"),
    (b"Access-Control-Allow-Credentials", b"true"),
    (b"Cross-Origin-Opener-Policy", b"same-origin"),
    (b"Referrer-Policy", b"same-origin"),
    (b"Access-Control-Allow-Headers", b"Origin, X-Requested-With, Content-Type, Content-Length, Accept, Authorization"),
    (b"Content-Length", content_length),  # 新增:告诉Axios响应体总长度
])             

3. 标记响应体发送完成

Django Channels 的 send_body 方法默认会标记 more_body=True,即告诉客户端还有后续数据。你需要显式设置 more_body=False,让 Axios 知道响应已经结束:

await self.send_body(response_body, more_body=False)

为什么 Fetch 能正常工作?

Fetch API 对响应的处理逻辑更宽松:即使没有 Content-Length 或未明确标记响应结束,它会在收到数据后就尝试解析,甚至允许在连接未关闭时处理部分响应。而 Axios 依赖严格的 HTTP 规范校验,必须确认响应完全接收才会触发成功回调,这就是两者表现差异的核心原因。

内容的提问来源于stack exchange,提问作者Doug Steiert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:56:13