How to send urlencoded parameters in POST request in python

Viewed 31875

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?

3 Answers

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)

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)
Related