【问题标题】:How to have Python3 requests library send actual Content-Length with post request instead of 0?如何让 Python3 请求库使用 post 请求而不是 0 发送实际的 Content-Length?
【发布时间】:2014-07-03 17:44:58
【问题描述】:

所以,我一直在努力制作一个脚本来验证NetDoT 安装。通常,浏览器会加载 URL 并使用我想要的 cookie 获得 302 重定向。相反,我的脚本得到 403 no cookie。经过大量调试,主要包括数据包捕获和 FireFox 篡改数据插件请求,并试图缩小请求库请求和 FireFox 请求之间的差距,我能够通过发送 Content-Length 在 Firefox 中重现该问题0,就像请求库一样。

所以,现在我试图弄清楚如何让请求库发送正确大小的 Content-Length 而不是 0。我搜索了谷歌,但没有发现任何明显的东西。我将 python3 与 Ubuntu 14.04 一起使用,以防万一。

那么,我如何让 requests 库计算并发送正确大小的 Content-Length 而不是 0?

这是我目前正在使用的。运行 wireshark 显示它发送的 Content-Length 为 0。

import requests
s = requests.Session()
s.headers.update({'referer':  'http://my.server.com/netdot/'})
b = s.post('http://my.server.com/netdot/NetdotLogin', params={'destination' : '/netdot/', 'credential_0' : 'admin', 'credential_1' : 'password'})

(不,我没有使用password 作为我的密码,我知道更多,我只是不想公开发布我的密码)。

【问题讨论】:

  • 请求库(通常)发送 Content-Length: 0 标头。相反,它会根据请求正文为您计算长度。向我们展示您的代码,以便我们确定真正会发生什么。
  • @MartijnPieters 更新了一个例子

标签: python http python-3.x python-requests


【解决方案1】:

params 参数用于传递 url 参数,而不是用于发送帖子内容。这就是您的 post 请求的内容长度为 0 的原因,因为它不包含任何内容。

要正确地将数据作为内容而不是 url 参数传递,请改用 data 参数:

...
b = s.post('http://my.server.com/netdot/NetdotLogin', data={'destination' : '/netdot/', 'credential_0' : 'admin', 'credential_1' : 'password'})
...

【讨论】:

  • 谢谢!在我花了半天时间想把我的头撞在桌子上之后,其他人看到的东西......我想我是从文档中为 get 方法选择的,并从那个开始因为帖子示例被标记为“高级”。
猜你喜欢
  • 2010-11-17
  • 2012-01-05
  • 1970-01-01
  • 2021-11-28
  • 2020-02-05
  • 2021-04-17
  • 2010-09-24
  • 2019-10-06
  • 2018-11-02
相关资源
最近更新 更多