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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:22