请求中的数据和参数有什么区别?

what is the difference between data and params in requests?

我正在使用 python requests 模块,我之前像这样发送我的参数:

requests.post(url=url, params=params)

但是今天,我发现我这样发送数据,失败了,我改成这样:

requests.post(url=url, data=params)

那就可以了,dataparams有什么区别?

我观察到请求得到了一个header X-Requested-With:XMLHttpRequest,是因为这个吗?

根据 requests documentation:

  • 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&param2=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()