【问题标题】:Python requests remove the Content-Length header from POSTPython 请求从 POST 中删除 Content-Length 标头
【发布时间】:2014-11-20 15:33:01
【问题描述】:

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

requests 模块允许您通过传入一个键设置为 None 的字典来删除某些标头。例如

headers = {u'User-Agent': None}

将确保没有用户代理随请求一起发送。

但是,似乎当我发布数据时,即使我指定 None 或不正确的值,请求也会为我计算正确的 Content-Length。例如。

headers = {u'Content-Length': u'999'}
headers = {u'Content-Length': None}

我检查了请求中使用的标头的响应 (response.request.headers),我可以看到 Content-Length 已重新添加了正确的值。到目前为止,我看不到任何禁用此行为的方法

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'})

我真的很想继续使用请求模块来执行此操作。这可能吗?

【问题讨论】:

    标签: python http python-requests http-content-length


    【解决方案1】:

    您必须prepare the request manually,然后删除生成的内容长度标头:

    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 服务器可能会忽略您的帖子正文!

    如果您打算使用chunked transfer encoding(您不必发送内容长度),则为data 参数使用迭代器。请参阅文档中的Chunked-Encoded Requests。在这种情况下不会设置Content-Length 标头。

    【讨论】:

    • 仅供参考,请求 >= 2.0,以及 Python 中的内置 urllib.requesthttp.client >= 3.6,当 Content-Length 不存在时自动切换到 Transfer-Encoding: chunked。请参阅 github.com/psf/requests/commit/…github.com/python/cpython/commit/… 。我浪费了很多时间试图在没有Content-Length 的情况下提交请求,然后才发现这一点。
    • @selurvedu:当对数据参数使用迭代器时,或者如果正文没有长度,则不会添加内容标题。此时使用了Transfer-Encoding: chunked,这就是我在最后一段中所指的内容。
    • @Martijn,当然,我就是这么说的。我错过了迭代器部分,但使用迭代器意味着无法轻松确定内容长度。
    • @selurvedu:是的,这就是重点。如果可以轻松确定内容长度,则绝对应该在请求中使用内容长度。
    猜你喜欢
    • 2018-04-06
    • 2021-06-14
    • 1970-01-01
    • 2019-11-21
    • 2011-04-20
    • 2020-02-05
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多