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

Abh*_*and 4 python api urlencode heroku flask

我正在尝试将生产就绪代码部署到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)
Run Code Online (Sandbox Code Playgroud)

由于我猜测data=params格式不正确,因此该行显示错误。

有什么方法可以将urlencoded参数发布到API?

Abh*_*ava 6

您无需显式编码,只需传递一个dict。

>>> r = requests.post(URL, data = {'key':'value'})
Run Code Online (Sandbox Code Playgroud)

文档中:

通常,您希望发送一些表单编码的数据,就像HTML表单一样。为此,只需将字典传递给data参数。提出请求后,您的数据字典将自动进行表单编码


Val*_*lie 6

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

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

       }
Run Code Online (Sandbox Code Playgroud)

字典需要转换成这种格式

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


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

       }

r = requests.post(URL, data = data)
Run Code Online (Sandbox Code Playgroud)

  • 这救了我的命。我应该更加关注我的“curl”请求,该请求运行良好,但由于这个原因“requests”却不能。我尝试了“json.dumps(data)”,发现它也不起作用,并且“requests”自动编码了请求正文。关键点是“requests”仅对请求正文的顶层进行编码。 (2认同)

小智 6

Content-Type标题设置为application/x-www-form-urlencoded.

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