使用urllib

时间:2016-02-04 14:26:53

标签: python httprequest urllib2 urllib

我正在尝试使用带有一些数据的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 请求类型发送数据。好奇心是这篇文章的原因。

2 个答案:

答案 0 :(得分:2)

data的{​​{1}}参数用于设置请求的正文。 GET请求不能包含正文,因为它们只应用于返回资源,该资源只能由其URL定义。

如果您需要传递参数,可以将它们附加到网址:

urlopen

答案 1 :(得分:1)

data参数仅用于POST,您无法在GET请求中发送正文,因此如果要指定参数,则必须通过URL传递它们。

构建此类网址的一种简单方法是urllib.urlencode的帮助。请查看此功能的文档。