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

Posted

技术标签:

【中文标题】请求中的数据和参数有啥区别?【英文标题】:what is the difference between data and params in requests?请求中的数据和参数有什么区别? 【发布时间】:2016-02-03 11:27:48 【问题描述】:

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

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

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

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

那没关系,dataparams有什么区别?

我观察到请求有一个标头X-Requested-With:XMLHttpRequest,是不是因为这个?

【问题讨论】:

你确定你不是得到而不是发帖吗? 在params中发送时遇到什么错误? 致所有人:考虑到多年来接受的答案有几个错误。我在 2 年前正确地回答了它,而接受答案的人今天只是用我的信息编辑了他自己的错误(您可以查看版本历史来查看它)。这是一种非常糟糕的行为,拿别人的功劳。如果问题的所有者没有做任何事情(将我的标记为正确的),至少你们都不赞成接受的答案,这就是我们必须从 *** 中删除的操作类型。 【参考方案1】:

根据requests documentation:

requests.post(url, data=data) 将发出 HTTP POST 请求,并且 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"

注意数据字段是如何消失的。

【讨论】:

post 不会在 URL 中发送数据。 get 方法可以。 @SekarRamu 看来我写的代码示例是对的,但我打错了上面的文字,所以我写了requests.get而不是requests.post。现在应该已修复此问题。【参考方案2】:

参数在(附加到)URI (http://www.answer.com/here?param1=1&param2=2) 中发送,而数据在request body 中发送。通常敏感数据或大量发送的数据会发布在正文中,因为secure 更容易并且不会导致巨大的 URI。

【讨论】:

为什么更容易保护? 因为 URI 以纯文本形式发送,并且通常存储在服务器日志中,所以如果您发送安全令牌/用户名/密码之类的内容,那么任何人都可以看到(并使用)它。 数据仍然可以被嗅探。您可以使用https:// 进行保护。编辑:不,你不能 不,你不能。这只能保护网络级别的攻击blog.httpwatch.com/2009/02/20/… 感谢您的链接。这太可怕了。而且真的很有帮助,内容丰富。【参考方案3】:

首先,有两种不同的方法

requests.post() 发出 POST 请求(将所有参数放在正文中) requests.get() 发出 GET 请求(将所有参数放在 URL 中)

然后,according to the docs,您可以在两个参数之间进行选择,以发送所有键/值数据:

params=,没有字符串修改。 data=,对参数应用表单编码字符串修改。

因此,您有 4 种选择来发送您的请求:

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

我认为当前接受的答案不正确。他实际上是在谈论requests.post(),但在他自己的示例中使用requests.get()

【讨论】:

错了。您不能在 GET 请求中使用 data 关键字。它只是默默地删除它。

以上是关于请求中的数据和参数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

jmeter http请求中的httpclient4和java有啥区别

MSF for CMMI 中的错误和更改请求之间有啥区别?

springmvc 请求头和请求体 有啥用

查询数据库和请求端点有啥区别?

struts2中的Action接口和Actionsupport接口各有啥作用

请问重定向与请求转发有啥区别?