我的印象是,使用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
我如何获得请求以第二种形式发送数据?
获得JSON的原因是因为您显式调用json.dumps以生成JSON字符串。只是不这样做,您就不会得到JSON字符串。换句话说,将第一行更改为:
json.dumps
data = {'param1': 'value1', 'param2': 'value2'}
正如文档所解释的,如果将dict作为data值传递,它将以形式编码,而如果传递字符串,则将按原样发送。
data
例如,在一个终端窗口中:
$ nc -kl 8765
在另一个:
$ 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
在第一个终端中,您将看到第一个请求主体是this(和Content-Type application/x-www-form-urlencoded):
application/x-www-form-urlencoded
spam=20&eggs=3
…而第二个是这个(并且没有Content-Type):
{"spam": 20, "eggs": 3}