请求中的数据和参数有啥区别?
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)
那没关系,data
和params
有什么区别?
我观察到请求有一个标头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有啥区别