【问题标题】:Python requests.post doesnt work if I pass payload with variables如果我通过变量传递有效负载,Python requests.post 不起作用
【发布时间】:2018-12-06 00:31:50
【问题描述】:

第 1 步:我从数据为 JSON 格式的文本文件中获取凭据 并将它们存储在一个变量中。

cred_values = {'username': 'myuser', 'password': 'mypwd'}

第二步:

username = cred_values['username']

password = cred_values['password']

第 3 步:准备我的有效负载、标头。有效载荷看起来像这样

login_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache',
    'Origin': 'https://xxxxxx.com.au', 'Upgrade-Insecure-Requests': '1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9',
}

login_data = {
    'curl': 'Z2FxxxxxZ2F', (xxxx - name of my company)
    'flags': '0',
    'forcedownlevel': '0',
    'formdir': '5',
    'username': username,
    'password': password,
    'trusted': '4',
    'SubmitCreds': ''
}

第 4 步:发布请求

 login_request_url = 'https://xxxx.com.au/Logon'
 login_response = requests.post(login_request_url, headers=login_headers, data=login_data)

注意

  1. 我也尝试将有效负载发送为

    login_data = {'username': '' + username + '','password': '' + password + ''}
    
    login_data = {'username': '' + str(username) + '','password': '' + str(password) + ''}
    
  2. 我还尝试将有效负载作为 json.dumps 发送到请求

    login_response = requests.post(login_request_url, headers=login_headers, data=json.dumps(login_data))
    

如果我发布上述请求但未登录,我不会收到任何错误。

例如:

如果我直接在 login_data 中添加我的用户名,密码

Url 长这样,表示登录成功-'https://xxxx.com.au/content.asp?token = xxxxx'

如果我通过从凭证文件中抓取来发送用户名和密码

Url 如下所示,表示未成功登录 - 'https://xxxx.com.au/'

【问题讨论】:

  • 出了什么问题?您的服务器是否收到错误消息或根本没有消息?或者你得到一个错误?
  • 这不可能是你的真实代码,因为login_headers 是未定义的。请发布您的真实代码。
  • 不加上url等细节就成谜了。因为我不知道发生了什么。
  • 如果您要发送 json 数据,请使用 json= 而不是 data=
  • 使用 json = 发布无效。它返回 400 响应

标签: python python-requests


【解决方案1】:

根据您的服务器的期望,您可能需要将 json 有效负载作为带引号的字符串发送:我认为您有以下内容:

login_data = {'username': '' + username + '','password': '' + password + ''}
login_data = {'username': '' + str(username) + '','password': '' + str(password) + ''}

试试下面的

login_data =  '{"username": " ' + str(username) + ' ","password": "' + str(password) + '"}'

使用单引号将代码转换为字符串,并使用双引号表示字符串中的引用值(或者您可以使用其他方式)。或者,您可以只使用相同的引号集并转义您想要在字符串中使用的引号,但我个人认为 get 很难很快阅读 例如

data =  '{\'username\': \''+ str(username) + '\',\'password\': \'' + str(password) + '\'}'

看看有没有帮助

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多