我的印象是使用x-www-form-urlencoded规范的POSTS应该在帖子的正文中发送一个URL编码的参数字符串。但是,当我这样做时
data = json.dumps({'param1': 'value1', 'param2': 'value2'})
Requests.post(url, data=data)
接收端的请求正文如下所示:
{"param1": "value1", "param2": "value2"}
但我期待得到这个
param1=value1¶m2=value2
我如何获得以第二种形式发送数据的请求?
答案 0 :(得分:26)
您获得JSON的原因是因为您明确调用json.dumps
来生成JSON字符串。只是不要这样做,你不会得到一个JSON字符串。换句话说,将第一行更改为:
data = {'param1': 'value1', 'param2': 'value2'}
正如the docs解释的那样,如果你传递一个dict作为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
在第一个终端中,您会看到第一个请求正文为此(以及内容类型application/x-www-form-urlencoded
):
spam=20&eggs=3
...而第二个是这个(并且没有Content-Type):
{"spam": 20, "eggs": 3}
答案 1 :(得分:3)
重要的添加不适用于嵌套json 因此,如果您有
# Wrong
data = {'param1': {'a':[100, 200]},
'param2': 'value2',
'param3': False}
# You have to convert values into string:
data = {'param1': json.dumps({'a':[100, 200]}),
'param2': 'value2',
'param3': json.dumps(False)}