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

如何使用Python获取请求的完整原始请求头?requests返回内容过少

如何用Python获取完整的原始请求头

当使用requests库时,默认不会直接返回完整的原始请求字符串(包含请求行、所有请求头),因为它封装了底层的请求构建逻辑。以下是几种实用的解决方法:

方法1:利用requests的PreparedRequest生成原始请求

通过手动构建准备好的请求对象,可以获取最终发送的完整原始请求内容,包括自动补充的头信息(如Host、Content-Length):

import requests

# 定义请求参数
url = "http://192.168.136.155:8081/service/rapture/session"
headers = {
    "X-Requested-With": "XMLHttpRequest",
    "X-Nexus-UI": "true",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36",
    "NX-ANTI-CSRF-TOKEN": "0.74934606792014381.1.691978768.1713947526; _gid=GA1.1.1983366476.1713947526; metabase.TIMEOUT=aliv",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Accept": "*/*"
}
data = "your_request_data_here"  # 需匹配Content-Length指定的字节数

# 创建并准备请求
req = requests.Request('POST', url, headers=headers, data=data)
prepped = req.prepare()

# 拼接成完整的原始请求字符串
raw_request = f"{prepped.method} {prepped.path_url} HTTP/1.1\r\n"
raw_request += "\r\n".join([f"{k}: {v}" for k, v in prepped.headers.items()])
raw_request += "\r\n\r\n" + prepped.body.decode('utf-8') if prepped.body else "\r\n\r\n"

# 输出完整请求
print(raw_request)

方法2:开启requests调试日志查看原始请求

通过配置日志级别,让requests输出发送的所有原始请求细节:

import requests
import logging

# 开启调试日志
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('requests.packages.urllib3')
logger.setLevel(logging.DEBUG)
logger.propagate = True

# 发送请求
url = "http://192.168.136.155:8081/service/rapture/session"
headers = {
    "X-Requested-With": "XMLHttpRequest",
    "X-Nexus-UI": "true",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36",
    "NX-ANTI-CSRF-TOKEN": "0.74934606792014381.1.691978768.1713947526; _gid=GA1.1.1983366476.1713947526; metabase.TIMEOUT=aliv",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Accept": "*/*"
}
data = "your_request_data_here"

response = requests.post(url, headers=headers, data=data)

运行后,控制台日志会打印完整的请求内容,包括请求行、所有请求头和请求体。

方法3:用socket手动构造原始请求(最底层控制)

如果需要完全自定义每一个请求细节,可以直接通过socket发送手动拼接的原始请求:

import socket

# 手动拼接完整的原始请求字符串
raw_request = (
    "POST /service/rapture/session HTTP/1.1\r\n"
    "Host: 192.168.136.155:8081\r\n"
    "Content-Length: 39\r\n"
    "X-Requested-With: XMLHttpRequest\r\n"
    "X-Nexus-UI: true\r\n"
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36\r\n"
    "NX-ANTI-CSRF-TOKEN: 0.74934606792014381.1.691978768.1713947526; _gid=GA1.1.1983366476.1713947526; metabase.TIMEOUT=aliv\r\n"
    "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n"
    "Accept: */*\r\n"
    "\r\n"
    "your_request_data_here"  # 确保内容长度为39字节
)

# 发送请求并接收响应
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.136.155", 8081))
s.sendall(raw_request.encode('utf-8'))

response = s.recv(4096)
print(response.decode('utf-8'))
s.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:11:14