使用 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。查看此功能的文档。
urlopen
的data
参数用于设置请求的body。 GET 请求不能包含正文,因为它们只能用于 return 资源,资源只能由 URL.
定义
如果您需要传递参数,可以将它们附加到 url,在您的情况下:
from urllib.request import urlopen
urlopen('http://localhost:8082/v3/nodes?{}'.format(query))
我正在尝试使用 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。查看此功能的文档。
urlopen
的data
参数用于设置请求的body。 GET 请求不能包含正文,因为它们只能用于 return 资源,资源只能由 URL.
如果您需要传递参数,可以将它们附加到 url,在您的情况下:
from urllib.request import urlopen
urlopen('http://localhost:8082/v3/nodes?{}'.format(query))