带表单数据的POST请求

时间:2016-03-22 01:28:33

标签: python session post request python-requests

我正在尝试模拟请求 有各种标题和括号表单数据。

表格数据:

{"username": "MY_USERNAME", "pass": "MY_PASS", "AUTO": "true"}

这是Chrome控制台中显示的表单数据 所以我尝试将它与Python的requests库结合在一起:

import requests
reqUrl = 'http://website.com/login'
postHeaders = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip,deflate',
    'Accept-Language': 'en-US,en;q=0.8',
    'Connection': 'keep-alive',
    'Content-Length': '68',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'website.com',
    'Origin': 'http://www.website.com',
    'Referer': 'http://www.website.com/',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.120 Chrome/37.0.2062.120 Safari/537.36'
}

payload = {"username": "MY_USERNAME",
    "pass": "MY_PASS",
    "AUTO": "true"
}

session = requests.Session()
response = session.post(reqUrl, data=payload, headers=postHeaders)

我收到了回复,但显示:

{"status":"failure","error":"Invalid request data"}

我是否正在实施表单数据错误?我还在想它可能与修改Content-Length

有关

1 个答案:

答案 0 :(得分:1)

是的,您正在设置内容长度,覆盖requests可能设置的任何内容。您设置了太多标题,而是将大部分标题保留在库中:

postHeaders = {
    'Accept-Language': 'en-US,en;q=0.8',
    'Origin': 'http://www.website.com',
    'Referer': 'http://www.website.com/',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.120 Chrome/37.0.2062.120 Safari/537.36'
}

很多。所有其他人都将为您生成。

但是,根据您对表单数据的描述,看起来您正在发布JSON。在这种情况下,请使用json关键字参数而不是data,它会将您的有效负载编码为JSON,并将Content-Type标头设置为application/json

response = session.post(reqUrl, json=payload, headers=postHeaders)