Python Requests中如何获取含响应头与响应体的总响应大小?
问题分析与解决
你的计算结果和Postman显示不一致,核心原因是没算全HTTP响应的完整结构,且响应头的格式处理有误,具体拆解和修正方案如下:
1. 差异根源:漏算HTTP响应关键部分
Postman统计的是整个HTTP响应的字节总数,包含以下4个核心部分,但你的代码只覆盖了其中2个:
- 状态行:比如
HTTP/1.1 200 OK\r\n - 响应头:每个头的标准格式是
Key: Value\r\n(无多余分号) - 头体分隔符:单独一行的
\r\n - 响应体:这部分你用
calculate_content_length()计算是正确的
你的代码存在两个明显问题:
- 给响应头添加了多余的分号
;,导致头长度计算错误 - 未统计状态行、头体分隔符的字节数,且用字符串长度
len()而非字节长度计算,可能因编码产生误差
2. 修正后的完整计算代码
以下是能准确计算完整HTTP响应字节数的代码:
from flask import Response import requests # 获取原始请求响应 resp = requests.get("https://someexamplesite.com/a/b", headers=headers, allow_redirects=False) resp_headers = dict(resp.headers) wf_resp = Response(resp.content, headers=resp_headers, status=resp.status_code) # 1. 计算状态行的字节长度 status_line = f"HTTP/1.1 {wf_resp.status_code} {wf_resp.status}\r\n" status_line_bytes = len(status_line.encode('latin-1')) # HTTP头标准编码用latin-1 # 2. 计算响应头的字节长度(遵循标准格式) headers_str = "" for k, v in wf_resp.headers.items(): headers_str += f"{k}: {v}\r\n" headers_bytes = len(headers_str.encode('latin-1')) # 3. 头与体的分隔符字节长度 separator_bytes = len("\r\n".encode('latin-1')) # 4. 响应体长度 body_bytes = wf_resp.calculate_content_length() or 0 # 总字节数计算 total_bytes = status_line_bytes + headers_bytes + separator_bytes + body_bytes print(f"完整响应总字节数:{total_bytes}") print(f"转换为KB:{total_bytes / 1024:.2f}KB")
3. 额外注意事项
- Postman的KB换算采用1KB=1024字节,你之前的21347字节≈20.85KB,和Postman的21.43KB差异就是漏算的状态行、分隔符,以及头格式错误导致的。
- HTTP响应头的标准编码是
latin-1,用它编码能避免非ASCII字符的长度误差。 - Flask的Response可能自动添加默认头(比如未显式设置时的
Content-Type),要确保resp_headers包含所有实际发送的头字段。
内容的提问来源于stack exchange,提问作者Keerthanaa Narayanan
相关产品推荐
相关产品推荐

