在python中如何在POST请求中发送urlencoded参数

在python中如何在POST请求中发送urlencoded参数,python,api,heroku,flask,urlencode,Python,Api,Heroku,Flask,Urlencode,我正在尝试将我的生产就绪代码部署到Heroku来测试它。不幸的是,它不接受JSON数据,所以我们将其转换为x-www-form-urlencoded params = urllib.parse.quote_plus(json.dumps({ 'grant_type': 'X', 'username': 'Y', 'password': 'Z' })) r = requests.post(URL, data=params) print(params) 这行显示了一个错误,

我正在尝试将我的生产就绪代码部署到Heroku来测试它。不幸的是,它不接受JSON数据,所以我们将其转换为x-www-form-urlencoded

params = urllib.parse.quote_plus(json.dumps({
    'grant_type': 'X',
    'username': 'Y',
    'password': 'Z'
}))
r = requests.post(URL, data=params)
print(params)
这行显示了一个错误,因为我猜
data=params
的格式不正确


有没有办法将URL编码的参数发布到API中?

您不需要显式编码,只需传递一个dict即可

>>> r = requests.post(URL, data = {'key':'value'})

通常,您希望发送一些表单编码的数据,很像HTML 形式。为此,只需向数据参数传递一个字典。你的 请求时,数据字典将自动进行表单编码 制造


需要注意的一点是,对于嵌套的json数据,需要将嵌套的json对象转换为字符串

data = { 'key1': 'value',
         'key2': {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }

       }
字典需要以这种格式转换

inner_dictionary = {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }


data = { 'key1': 'value',
         'key2': json.dumps(inner_dictionary)

       }

r = requests.post(URL, data = data)

内容类型
标题设置为
应用程序/x-www-form-urlencoded

headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post(URL, data=params, headers=headers)

只需将dict传递到
数据
,默认情况下,请求将以x-www-form-urlencoded的形式发送。这节省了我的时间。我本应该更加注意我的
curl
请求,它工作得很好,但由于这个原因
请求
没有工作。我尝试了
json.dumps(data)
,发现它也不起作用,
requests
自动对请求体进行编码。关键的一点是
请求
只对请求正文的顶层进行编码。