Python请求从POST中删除内容长度头
我正在使用python请求模块对一个站点进行一些测试 requests模块允许您通过传入一个键设置为None的字典来删除某些头。比如说Python请求从POST中删除内容长度头,python,http,python-requests,http-content-length,Python,Http,Python Requests,Http Content Length,我正在使用python请求模块对一个站点进行一些测试 requests模块允许您通过传入一个键设置为None的字典来删除某些头。比如说 headers = {u'User-Agent': None} 将确保不随请求发送任何用户代理 然而,当我发布数据时,请求似乎会为我计算正确的内容长度,即使我没有指定,或者指定了错误的值。例如 headers = {u'Content-Length': u'999'} headers = {u'Content-Length': None} 我检查了请求中使用
headers = {u'User-Agent': None}
将确保不随请求发送任何用户代理
然而,当我发布数据时,请求似乎会为我计算正确的内容长度,即使我没有指定,或者指定了错误的值。例如
headers = {u'Content-Length': u'999'}
headers = {u'Content-Length': None}
我检查了请求中使用的标题(response.request.headers)的响应,我可以看到内容长度已经用正确的值重新添加。到目前为止,我看不到任何方法来禁用这种行为
CaseInsensitiveDict({'Content-Length': '39', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'python-requests/2.2.1 CPython/2.7.6 Linux/3.13.0-36-generic'})
我真的很想继续使用请求模块来完成这项工作。这可能吗?您必须删除生成的内容长度标题:
from requests import Request, Session
s = Session()
req = Request('POST', url, data=data)
prepped = req.prepare()
del prepped.headers['content-length']
response = s.send(prepped)
请注意,大多数兼容的HTTP服务器可能会忽略您的帖子正文
如果您打算使用(不必发送内容长度),则使用迭代器作为
数据
参数。请参阅文档中的。在这种情况下,不会设置Content Length
头。FYI,Requests>=2.0,以及内置的urllib.request
和http.client
在Python>=3.6中,当Content Length
不存在时,自动切换到传输编码:chunked
。见和。在发现这一点之前,我浪费了很多时间试图提交一个没有内容长度的请求。@selurvedu:当使用迭代器作为数据参数时,或者如果正文没有长度,则不会添加内容头。在这一点上,传输编码:使用了chunked
,这就是我在最后一段中提到的内容。@Martijn,当然,这就是我所说的。我错过了迭代器部分,但使用迭代器意味着内容长度不容易确定。@selurvedu:是的,这就是重点。如果可以轻松确定内容长度,那么您肯定应该在请求中使用内容长度。