Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python requests module sends JSON string instead of x-www-form-urlencoded param string

I was under the impression that POSTSs using x-www-form-urlencoded specifications should send a URL encoded param string in the body of the post. However, when I do this

data = json.dumps({'param1': 'value1', 'param2': 'value2'}) Requests.post(url, data=data) 

The body of the request on the receiving end looks like this:

{"param1": "value1", "param2": "value2"} 

But I was expecting to get this

param1=value1&param2=value2 

How I can get Requests to send the data in the second form?

like image 642
asolberg Avatar asked Oct 28 '14 18:10

asolberg


1 Answers

The reason you're getting JSON is because you're explicitly calling json.dumps to generate a JSON string. Just don't do that, and you won't get a JSON string. In other words, change your first line to this:

data = {'param1': 'value1', 'param2': 'value2'} 

As the docs explain, if you pass a dict as the data value, it will be form-encoded, while if you pass a string, it will be sent as-is.


For example, in one terminal window:

$ nc -kl 8765 

In another:

$ python3 >>> import requests >>> d = {'spam': 20, 'eggs': 3} >>> requests.post("http://localhost:8765", data=d) ^C >>> import json >>> j = json.dumps(d) >>> requests.post("http://localhost:8765", data=j) ^C 

In the first terminal, you'll see that the first request body is this (and Content-Type application/x-www-form-urlencoded):

spam=20&eggs=3 

… while the second is this (and has no Content-Type):

{"spam": 20, "eggs": 3} 
like image 178
abarnert Avatar answered Sep 24 '22 16:09

abarnert