我有一个 Node.js 客户端代码,它将请求发送到 HTTP 服务器,然后连续接收分块编码数据。
这是带有一些流量数据输出的 Node.js 代码。
const http = require('http');
const options = {
hostname: '...',
path: '...',
port: ...,
...
};
const req = http.request(options, (res) => {
res.on('data', (data) => {
data_size += data.length;
average_data_rate = data_size / (Math.round(Date.now() / 1000) - start_time);
console.log(data.length + ', avg: ' + average_data_rate.toFixed(1) + ' /s');
});
res.on('end', () => {
console.log('Body:', JSON.parse(data))
});
}).on("error", (err) => {
console.log("Error: ", err)
}).end()
我想将其转换为 Python3 ,但是不清楚连续数据接收部分怎么写。
import requests
url = '...'
my_headers = {
...
}
response = requests.get(url, ???, headers=my_headers) ???
import requests
import time
url = '...'
my_headers = {
...
}
data_size = 0
start_time = round(time.time())
with requests.get(url, headers=my_headers, stream=True) as response:
response.raise_for_status()
for chunk in response.iter_content(chunk_size=8192):
if chunk:
data_size += len(chunk)
average_data_rate = data_size / (round(time.time()) - start_time)
print(f"{len(chunk)}, avg: {average_data_rate:.1f} /s")
if response.headers.get('content-type') == 'application/json':
print('Body:', response.json())
else:
# 处理非 JSON 响应
print("Body:", response.content)
说明:
-
stream=True
: 我们在requests.get
中设置stream=True
来启用流式响应。这可以避免将整个响应体一次性加载到内存中,对于大型数据流很有用。 -
response.iter_content(chunk_size=8192)
: 这会迭代响应内容的块。chunk_size
指定一次读取的字节数(此处为 8KB)。 可以根据需要调整此值。 -
数据处理 : 在循环内部,我们计算接收到的数据量和平均数据速率,并像 Node.js 代码一样将其打印出来。
-
响应体处理 :
-
我们首先检查响应头中的
content-type
是否为application/json
。 -
如果是,则使用
response.json()
将 JSON 响应解析为 Python 字典。 -
如果不是,则打印原始响应内容 (
response.content
)。 可以根据需要修改此部分来处理其他类型的响应。
-
我们首先检查响应头中的
此代码模拟了 Node.js 代码的行为,允许以流式方式处理分块编码的数据,并访问每个数据块及其相关信息。
标签:python,node.js,http,chunked-encoding From: 78818561