How to send urlencoded parameters in POST request in python
Solution 1
You don't need to explicitly encode it, simply pass a dict.
>>> r = requests.post(URL, data = {'key':'value'})
From the documentation:
Typically, you want to send some form-encoded data — much like an HTML form. To do this, simply pass a dictionary to the data argument. Your dictionary of data will automatically be form-encoded when the request is made
Solution 2
Set the Content-Type
header to application/x-www-form-urlencoded
.
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post(URL, data=params, headers=headers)
Solution 3
Just to an important thing to note is that for nested json data you will need to convert the nested json object to string.
data = { 'key1': 'value',
'key2': {
'nested_key1': 'nested_value1',
'nested_key2': 123
}
}
The dictionary needs to be transformed in this format
inner_dictionary = {
'nested_key1': 'nested_value1',
'nested_key2': 123
}
data = { 'key1': 'value',
'key2': json.dumps(inner_dictionary)
}
r = requests.post(URL, data = data)
Abhinav Anand
Experienced Golang, Python & Node.js developer
Updated on February 25, 2020Comments
-
Abhinav Anand about 4 years
I'm trying to deploy my production ready code to Heroku to test it. Unfortunately, it is not taking JSON data so we converted into 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)
It is showing an error in this line as I guess
data=params
is not in proper format.Is there any way to POST the urlencoded parameters to an API?
-
Spectrum about 3 yearsThis saved my day. I should have paid more attention to my
curl
request which was working fine but for this reasonrequests
wasn't. I triedjson.dumps(data)
and found that didn't work either, and thatrequests
automatically encoded the request body. The key point is thatrequests
only encoded the top level of the request body.