Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求从POST中删除内容长度头_Python_Http_Python Requests_Http Content Length - Fatal编程技术网

Python请求从POST中删除内容长度头

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} 我检查了请求中使用

我正在使用python请求模块对一个站点进行一些测试

requests模块允许您通过传入一个键设置为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:是的,这就是重点。如果可以轻松确定内容长度,那么您肯定应该在请求中使用内容长度。