如何让Python3的requests库在POST请求中发送实际的Content-Length而不是0?
我最近在写一个脚本,目的是让它能登录到一个叫做 NetDoT 的系统。通常情况下,浏览器会加载这个网址,然后得到一个302重定向,并带上我需要的cookie。但是我的脚本却收到一个403错误,说明没有cookie。在调试的过程中,我主要是抓包和使用FireFox的tamper-data插件来对比请求,想要找出我用的请求库和FireFox之间的差别。最后,我发现如果让我在FireFox中发送一个Content-Length为0的请求,就能重现这个问题,这和请求库的行为一样。
现在,我想弄明白怎么让请求库发送一个正确大小的Content-Length,而不是0。我在谷歌上搜索过,但没有找到明显的解决办法。我是在使用python3和Ubuntu 14.04,如果这有影响的话。
那么,怎么才能让请求库计算并发送一个正确大小的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
,我知道这样不好,我只是想保护我的密码不被公开。)
1 个回答
2
params
这个参数是用来传递网址中的参数的,而不是用来发送POST请求的内容。这就是为什么你的POST请求的内容长度是0,因为它没有包含任何内容。
要正确地将数据作为内容传递,而不是作为网址参数,请使用data
这个参数:
...
b = s.post('http://my.server.com/netdot/NetdotLogin', data={'destination' : '/netdot/', 'credential_0' : 'admin', 'credential_1' : 'password'})
...