我正在尝试使用带有一些数据的urllib / urllib2发送HTTP GET 请求。
如果我们在urllib2.urlopen(url,data)中设置数据param的某个值,则请求对象将更改为发送POST请求而不是GET。
有没有办法实现这个目标?标准还是Hack?
代码段,
import requests
import urllib
query = urllib.urlencode({'query':'["=", ["fact", "role"], "storage"]'})
# using request object
print 'Output 1.'
response = requests.get("http://localhost:8082/v3/nodes", data=query)
print response.json()
print
# using urllib object
print 'Output 2.'
resp = urllib.urlopen('http://localhost:8082/v3/nodes', data=query)
print resp.read()
输出:
Output 1.
[{u'deactivated': None, u'facts_timestamp': u'2016-02-04T14:06:07.269Z', u'name': u'node_xx_11', u'report_timestamp': None, u'catalog_timestamp': u'2016-02-04T14:06:16.958Z'}, {u'deactivated': None, u'facts_timestamp': u'2016-02-04T14:06:05.865Z', u'name': u'node_xx_12', u'report_timestamp': None, u'catalog_timestamp': u'2016-02-04T14:06:13.614Z'}]
Output 2.
The POST method is not allowed for /v3/nodes
为了 参考资料我已经完成了,
https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
https://docs.python.org/2/library/urllib2.html#urllib2.Request.add_data
这不是我的障碍,因为我可以使用请求模块以 GET 请求类型发送数据。好奇心是这篇文章的原因。
答案 0 :(得分:2)
data
的{{1}}参数用于设置请求的正文。 GET请求不能包含正文,因为它们只应用于返回资源,该资源只能由其URL定义。
如果您需要传递参数,可以将它们附加到网址:
urlopen
答案 1 :(得分:1)
data参数仅用于POST,您无法在GET请求中发送正文,因此如果要指定参数,则必须通过URL传递它们。
构建此类网址的一种简单方法是urllib.urlencode的帮助。请查看此功能的文档。