我想使用Python 3模块urllib在localhost:9200
来访问数据库Elasticsearch。我的脚本得到一个有效的请求(由Kibana生成)以JSON格式传递给STDIN。访问Elasticsearch与Python 3
这里是我做过什么:
import json
import sys
import urllib.parse
import urllib.request
er = json.load(sys.stdin)
data = urllib.parse.urlencode(er)
data = data.encode('ascii')
uri = urllib.request.Request('http://localhost:9200/_search', data)
with urllib.request.urlopen(uri) as repsonse:
response.read()
(据我所知,我的repsonse.read()
本身并不多大意义,但我只是想保持简单。)
当我执行该脚本,我得到一个
HTTP Error 400: Bad request
我非常肯定的JSON数据,我管的脚本是正确的,因为我把它印,并通过curl
它喂给ELAST icsearch,并收回了我期望回来的文件。
任何想法,我哪里出错了?我正确使用urllib
吗?我是否可能搞乱了urlencode
系列中的JSON数据?我是否正确查询Elasticsearch?
感谢您的帮助。
你可能需要指定的内容类型...在这里看到:https://docs.python.org/3/library/urllib.request.html#urllib.request.Request ..如果你不指定一个内容类型,它将默认为application/x-www-form-urlencoded,这不是你发送的内容。如果您不介意使用外部库,请求(http://docs.python-requests.org/en/master/)使这更简单一些... –
您可以提供数据对象的示例吗?你传递给ElasticSearch?顺便说一句我使用请求库查询到ES。这非常简单。只是好奇 - 为什么使用Kibana来创建有效载荷(数据),并且一旦你通过了400,你打算如何处理这个响应? – jlaur
@CorleyBrigman:我希望我可以使用请求库。不幸的是,我在高度安全的环境中工作,他们非常不愿意安装任何超出严格要求的东西。 – eins6180