请求中的数据和参数有什么区别?
what is the difference between data and params in requests?
我正在使用 python requests
模块,我之前像这样发送我的参数:
requests.post(url=url, params=params)
但是今天,我发现我这样发送数据,失败了,我改成这样:
requests.post(url=url, data=params)
那就可以了,data
和params
有什么区别?
我观察到请求得到了一个header X-Requested-With:XMLHttpRequest
,是因为这个吗?
- A
requests.post(url, data=data)
将发出 HTTP POST 请求,并且
- A
requests.get(url, params=params)
将发出 HTTP GET 请求
要了解两者的区别,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"
}
请注意,有效负载最终出现在 URL 的 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 的 params 关键字,以及
- 用于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"
}
注意数据字段是如何消失的。
参数在 URI (http://www.answer.com/here?param1=1¶m2=2
) 中发送(附加到),而数据在 request body. Usually sensitive data or that sent in large volumes is posted in the body because it's easier to secure 中发送并且不会导致巨大的 URI。
首先有两种不同的方法:
requests.post()
发出 POST 请求(将所有参数放在正文中)
requests.get()
发出 GET 请求(将所有参数放在 URL)
然后,according to the docs,您可以在两个参数之间选择发送所有key/value数据:
params=
,没有字符串修改。
data=
,对参数应用形式编码字符串修改。
那么,您有 4 个选择来发送您的请求:
requests.post(url, params=)
requests.post(url, data=)
requests.get(url, params=)
requests.get(url, data=)
我认为当前接受的答案不正确。他实际上是在谈论 requests.post()
但在他自己的示例中使用 requests.get()
。
我正在使用 python requests
模块,我之前像这样发送我的参数:
requests.post(url=url, params=params)
但是今天,我发现我这样发送数据,失败了,我改成这样:
requests.post(url=url, data=params)
那就可以了,data
和params
有什么区别?
我观察到请求得到了一个header X-Requested-With:XMLHttpRequest
,是因为这个吗?
- A
requests.post(url, data=data)
将发出 HTTP POST 请求,并且 - A
requests.get(url, params=params)
将发出 HTTP GET 请求
要了解两者的区别,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"
}
请注意,有效负载最终出现在 URL 的 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 的 params 关键字,以及
- 用于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"
}
注意数据字段是如何消失的。
参数在 URI (http://www.answer.com/here?param1=1¶m2=2
) 中发送(附加到),而数据在 request body. Usually sensitive data or that sent in large volumes is posted in the body because it's easier to secure 中发送并且不会导致巨大的 URI。
首先有两种不同的方法:
requests.post()
发出 POST 请求(将所有参数放在正文中)requests.get()
发出 GET 请求(将所有参数放在 URL)
然后,according to the docs,您可以在两个参数之间选择发送所有key/value数据:
params=
,没有字符串修改。data=
,对参数应用形式编码字符串修改。
那么,您有 4 个选择来发送您的请求:
requests.post(url, params=)
requests.post(url, data=)
requests.get(url, params=)
requests.get(url, data=)
我认为当前接受的答案不正确。他实际上是在谈论 requests.post()
但在他自己的示例中使用 requests.get()
。