How to send urlencoded parameters in POST request in python

Question:

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?

Asked By: Abhinav Anand

||

Answers:

You don’t need to explicitly encode it, simply pass your dict to data argument and it will be encoded automatically.

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

From the official 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

Answered By: Abhinav Srivastava

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)
Answered By: Vallie

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)
Answered By: Rainbow Fossil
Categories: questions Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.