2014-10-28 75 views
2

我的印象是,使用x-www-form-urlencoded规范的POSTS应该在帖子正文中发送URL编码的参数字符串。然而,当我这样做Python请求模块发送JSON字符串而不是x-www-form-urlencoded参数字符串

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

在接收端请求的身体看起来是这样的:

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

但我希望得到这个

param1=value1&param2=value2 

我怎样才能请求以第二种形式发送数据?

回答

9

你得到JSON的原因是因为你明确地调用json.dumps来生成一个JSON字符串。只是不这样做,你不会得到一个JSON字符串。换句话说,你的第一行改成这样:

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

由于the docs解释,如果你传递一个字典作为data值,这将是形式编码的,而如果你传递一个字符串,它会被发送原样。


例如,在一个终端窗口:

$ nc -kl 8765 

在另一:

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

在第一终端,你会看到一个第一请求体是这样的(和Content-Type application/x-www-form-urlencoded):

spam=20&eggs=3 

...而第二个是这个(并没有内容类型):

{"spam": 20, "eggs": 3} 
相关问题