Content Length 表示的是 http 请求中的数据长度,也就是 requests 中的 data 对应长度。
通常我们给 requests 传递的 data 是字典格式的,那么直接使用 len(data)是无法获得准确的 content length 的。

在 http 中,data 是以字符串的形式传递的。那么以下的字典格式的 data 对应的字符串是什么呢?

1
2
3
4
data = {
'fid': 'df05ef96b6407055f8690b5f30322b58db776ecc7ef099197f03353e'
'BS_Termin_2021-06-14': 'buchen'
}

其对应的在 tcp 传输中的字符串是

fid=df05ef96b6407055f8690b5f30322b58db776ecc7ef099197f03353e&BS_Termin_2021-06-14=buchen

可以看到,键和值以’=’连接,多个参数以’&’连接。下面使用 python 代码计算整个字符串长度

1
2
3
4
5
6
7
8
9
def get_content_length(data):
#计算=和&的字节数
length = len(data.keys()) * 2 - 1
#计算键值的字节数。最后的encode是对字符串进行utf编码,
#如果键值包含中文,那么一个汉字字符对应三个字节,len()方法只能计算字符的个数
#而content length是字节数
total = ''.join(list(data.keys()) + list(data.values())).encode()
length += len(total)
return str(length)

评论