我正在使用 python requests
模块,我之前像这样发送我的参数:
requests.post(url=url, params=params)
但是今天,我发现我这样发送数据,失败了,我改成这样:
requests.post(url=url, data=params)
那没问题,data
和params
有什么区别?
我观察到请求有一个header X-Requested-With:XMLHttpRequest
,是因为这个吗?
最佳答案
要了解两者的区别,see this answer .
下面是如何在 GET 中使用参数:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.text)
哪些输出
{
"args": {
"key1": "value1",
"key2": "value2"
},
[...]
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}
请注意,有效负载最终出现在 query string 中。的网址。由于它们在那里结束,因此任何有权访问该 URL 的人都可以查看它们,这就是为什么您不应该将查询字符串用于敏感数据(如密码)的原因。
以下是如何在 POST 中使用数据:
payload = 'foobar'
r = requests.post('http://httpbin.org/post', data=payload)
print(r.text)
哪些输出
{
"args": {},
"data": "foobar",
[...]
"url": "http://httpbin.org/post"
}
请注意 POST 数据如何不显示在查询字符串中,因为它们是通过请求的主体传输的。
对该答案的批评指出,还有更多选择。我在原来的回答中从未否认过这样的事情,但让我们仔细看看。
文档示例总是显示:
- 用于 GET 的参数关键字,以及
- 用于 POST 的数据关键字
但这并不意味着它们是相互排斥的。
理论上,您可以在 POST 中将两者混合在一起:
data = 'foobar'
params = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', params=params, data=data)
print(r.text)
哪些输出
{
"args": {
"key1": "value1",
"key2": "value2"
},
"data": "foobar",
[...]
"url": "http://httpbin.org/post?key1=value1&key2=value2"
}
但是您不能将数据混合到 GET 中:
data = 'foobar'
params = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=params, data=data)
print(r.text)
输出:
{
"args": {
"key1": "value1",
"key2": "value2"
},
[...]
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}
注意数据字段是如何消失的。
关于python - 请求中的数据和参数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33496953/