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
相关产品推荐
相关产品推荐

