How to send urlencoded parameters in POST request in python

25,939

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)
Share:
25,939
Abhinav Anand
Author by

Abhinav Anand

Experienced Golang, Python & Node.js developer

Updated on February 25, 2020

Comments

  • Abhinav Anand
    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
    Spectrum about 3 years
    This saved my day. I should have paid more attention to my curl request which was working fine but for this reason requests wasn't. I tried json.dumps(data) and found that didn't work either, and that requests automatically encoded the request body. The key point is that requests only encoded the top level of the request body.