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

HTTP 400 Bad Request错误成因及修复方法(附Python Socket示例)

Python socket发起HTTP请求出现400 Bad Request的原因与修复方案

示例代码的直接错误原因

你给出的代码触发400错误的核心问题有2个:

  • HTTP 1.0/1.1协议强制要求头部的换行符为\r\n(CRLF格式),代码中使用了\n(LF格式),不符合规范导致服务端解析失败
  • 已经和data.pr4e.org的80端口建立连接的前提下,请求行的GET参数只需填写资源路径,不需要携带完整URL前缀

修复后的可运行代码

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
# 修复点:用\r\n做换行、GET后只填资源路径、补充Host头兼容服务端校验规则
cmd = 'GET /romeo.txt HTTP/1.0\r\nHost: data.pr4e.org\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode())
mysock.close()

400 Bad Request的常见触发原因

  • 请求格式不符合HTTP规范:比如换行符用LF代替CRLF、请求行的方法/路径/协议版本格式错误、请求头不符合键名: 键值的格式要求
  • 缺失必要请求头:HTTP 1.1协议强制要求携带Host头,缺失会直接返回400;部分接口要求的鉴权头、内容类型头缺失也可能触发
  • 请求内容超出服务端限制:请求行长度、请求体大小超过服务端设置的最大阈值
  • 存在非法字符:请求路径、头部、请求体中包含服务端不允许的特殊字符,或者字符编码错误
  • 本地缓存数据非法:携带的Cookie格式错误、过期,被服务端校验拦截

排查修复思路

  • 优先对照HTTP规范校验请求格式:重点检查换行符是否为\r\n,请求行、请求头的格式是否符合要求
  • 抓包对比正常请求:用浏览器、requests库等发起同路径的正常请求,将抓包得到的请求内容和自己拼接的内容逐字符对比,定位差异
  • 检查必要头部是否齐全:HTTP 1.1必须加Host头,POST请求还要补充Content-Length、Content-Type头
  • 校验编码:确认所有请求内容的编码格式符合服务端要求,默认使用utf-8编码即可
  • 简化请求定位问题:先只保留基础请求行和必要头部,请求通了之后再逐步添加其他内容,缩小错误范围

内容的提问来源于stack exchange,提问作者Ko John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:03