Python请求POST命令未遵循302重定向

时间:2019-05-10 23:31:55

标签: python python-3.x post https python-requests

通过请求将POST请求传递到网站时,它无法完成,将无限期等待。

我已经检查了Fiddler中的行为,并且可以看到POST请求通过302重定向成功返回。但是,请求继续等待,即使数据包已返回,请求也永远不会继续。

由于没有明显的错误并且数据包似乎返回了,因此我将继续诊断该问题,我们将不胜感激。

发布请求的构建方式如下:

loginData = 'data=45B892A0F9C127FB0A052CB&cid=1000'
s.post(url, verify=rVerify, headers=headers, data=loginData)

我尝试将allow_redirects设置为True和False都没有成功。

这是Fiddler中的请求和响应:

fiddler result

更新标题详细信息:

'User-Agent': 'Mozilla/5.0'
'Content-Type': 'application/x-www-form-urlencoded'
'Connection': 'Keep-Alive'
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
'Accept-Language': 'en-US,en;q=0.5'
'Accept-Encoding': 'gzip, deflate, br'

更新:

  • 我仅使用URL进行了测试,命令仍然会挂起。
  • 我也尝试了GET请求,并且也挂起了。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用POST对象手动重定向下一个随302返回的URL。

loginData = 'data=45B892A0F9C127FB0A052CB&cid=1000'
response = s.post(url, verify=rVerify, headers=headers, data=loginData)

next_url = response['location']

# do your next step here using the returned URL

302应该返回一个URL,以将其重定向到标头中的“ Location”值。如上所示,您将在Response对象字典中找到它。

来源:https://en.wikipedia.org/wiki/HTTP_302https://2.python-requests.org/en/master/api/#requests.Response

答案 1 :(得分:0)

因此问题似乎出在Python3上,而httplib库无法解析服务器返回的标头。

这是问题所在:https://github.com/kennethreitz/requests/issues/3098

要解决这个问题,我刚刚更改为Python 2,它不需要以相同的方式解析标头。