使用 python 请求传递带有“+”字符的电子邮件

Passing email with '+' character using python requests

我正在尝试将电子邮件传递到其中包含“+”字符的端点。端点接受 application/x-www-form-urlencoded。例如,如果我有 username=test+user@gmail.com,Postman 会创建以下 curl,其中包含“+”和“@”html 编码:

curl -X POST \
  http://myurl.com/test \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Postman-Token: 07181aad-f4a5-4ac5-1720-dcb59d7e8310' \
  -d username=test%2Buser%40gmail.com

此调用按预期工作

但是,在使用请求时,该字段似乎没有被编码。

import requests

if __name__ == "__main__":
    timeout = 10
    url = "https://myurl/test"
    header_data = {'Content-Type': 'application/x-www-form-urlencoded'}
    header_data = {}
    payload = "username=test+user@gmail.com"
    r = requests.request("POST", url, data=payload, headers=header_data, timeout=timeout)
    print (r.request.body)

最终打印的结果不是编码字符串,而是:

username=test+user@gmail.com

如果您传入字符串,请求将 pass that payload on unmodified (see also the source)。使用

payload = {'username': "test+user@gmail.com"}

得到form-encoding.