我想使用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