使用 urllib 发送 HTTP GET 请求

Sending HTTP GET request using urllib

我正在尝试使用 urllib/urllib2 和一些数据发送 HTTP GET 请求。

如果我们在 urllib2.urlopen(url, data) 中设置一些数据参数值,请求对象将更改为发送 POST 请求而不是 GET。

有什么办法可以实现吗?标准版还是黑客版?

代码片段,

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 请求类型的数据。好奇心是这个原因post.

数据参数仅供 POST 使用,您不能在 GET 请求中发送正文,因此如果您想指定参数,则必须通过 URL 传递它们。

构建这样一个 URL 的一种简单方法是借助 urllib.urlencode。查看此功能的文档。

urlopendata参数用于设置请求的body。 GET 请求不能包含正文,因为它们只能用于 return 资源,资源只能由 URL.

定义

如果您需要传递参数,可以将它们附加到 url,在您的情况下:

from urllib.request import urlopen
urlopen('http://localhost:8082/v3/nodes?{}'.format(query))