记一次前端请求报错:Content-Length can‘t be present with Transfer-Encoding,+Cursor使用教训

一、背景:

用Cursor开发了一个简单的前端工程(Vue+Vite)、一个简单的后端工程(Python+Flask),前端走http调用后端接口。

二、问题:

web页面列表加载数据报错:Parse Error: Content-Length can't be present with Transfer-Encoding

bash 复制代码
17:16:37 [vite] http proxy error at /api/QueryByCond:
Error: Parse Error: Content-Length can't be present with Transfer-Encoding
    at Socket.socketOnData (node:_http_client:494:22)
    at Socket.emit (node:events:527:28)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at Socket.Readable.push (node:internal/streams/readable:228:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)

后端服务返回对象数据示例如下:

bash 复制代码
Response Content: b'{"task_list":[{"id":'
Response Content Length: 329427
Response Status Code: 200
Response Headers: {'Content-Type': 'application/json', 'Trpc-Trans-Info': 
  '{"oms-traceid":"MjAxxx","oms-user":"","oms_trace_id":"MjAxxx",
  "oms_user":"","x-username":""}', 'X-Content-Type-Options': 'nosniff', 
  'Date': 'Fri, 12 Dec 2025 09:17:59 GMT', 
  'Transfer-Encoding': 'chunked'}
Response Elapsed: 0:00:00.034671
Response Request: <PreparedRequest [POST]>
Response URL: http://xx:8991/QueryByCond       
127.0.0.1 - - [12/Dec/2025 17:17:59] "POST /api/QueryByCond HTTP/1.1" 200 -

三、原因:

当前端调用后端接口时,若响应头中同时包含 Content-Length和 Transfer-Encoding: chunked(或其他分块传输编码),这会违反 HTTP/1.1 协议的规范(RFC 7230)。根据协议,这两个头部字段不能共存,因为:

Content-Length声明了响应体的固定长度;

Transfer-Encoding: chunked表示响应体采用分块传输(无固定长度,通过块大小和结束标记标识)。

四、解决:

修改后端代码,避免同时包含 Content-Length和 Transfer-Encoding: chunked。

修改后的py后端代码:

python 复制代码
    try:
        # 转发请求,调用第三方http接口
        response = requests.request(
            method=request.method,
            url=target_url,
            params=params,
            data=data if not request.is_json else None,
            json=data if request.is_json else None,
            headers=headers,
            timeout=30,
            allow_redirects=False
        )

        # 创建响应
        # 过滤掉传输相关的响应头,避免与 Content-Length 冲突
        filtered_headers = {}
        # 需要排除的响应头(小写)
        exclude_headers = {
            'content-length',      # Flask 会自动计算
            'transfer-encoding',   # 避免与 Content-Length 冲突
            'connection',          # 连接相关,不需要转发
            'keep-alive',          # 连接相关
        }

        for key, value in response.headers.items():
            if key.lower() not in exclude_headers:
                filtered_headers[key] = value

        flask_response = Response(
            response.content,
            status=response.status_code,
            headers=filtered_headers
        )


        return flask_response

五、教训:

一次前后端联调的经历让我对Cursor的使用有了更深体会。起初,我在前端工程中用Cursor排查问题,尝试多种方案均无果,最终发现根源竟在后端的代码里。

当我带着对问题的理解和思考转向后端调试,Cursor便迅速解决了问题。这印证了一点:Cursor的强大毋庸置疑,但它依赖于我们提供的"正确方向"------这需要我们对问题有独立的初步研判。AI是利器,而独立思考,才是用好利器的前提。

相关推荐
计算机魔术师20 分钟前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端
去伪存真44 分钟前
大模型的参数量为什么那么大?
前端·人工智能
IT_陈寒1 小时前
Java空指针这次真把我坑惨了
前端·人工智能·后端
八荒启·交互动画2 小时前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
动恰客流统计2 小时前
线下零售数字化浪潮下,客流统计的3个核心发展趋势
大数据·前端·人工智能
用户938515635073 小时前
从小米前端面试题,彻底搞懂闭包、作用域链与 useState 惰性初始化
前端·面试
粥里有勺糖4 小时前
视野修炼第133期 | Native 回春了?
前端·github·agent
aichitang20244 小时前
前端小skill
前端·人工智能·算法·ai·前端框架
前端·柱子5 小时前
q-floodfill白边锯齿?一招搞定抗锯齿边缘问题
前端·html·canva可画
葡萄城技术团队5 小时前
SpreadJS V19.2新特性揭秘:功能区键盘提示
前端