如何让Python3的requests库在POST请求中发送实际的Content-Length而不是0?

0 投票
1 回答
777 浏览
提问于 2025-04-18 12:02

我最近在写一个脚本,目的是让它能登录到一个叫做 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'})
...

撰写回答