2017-07-06 90 views
0

我想使用Python 3模塊urlliblocalhost: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?

感謝您的幫助。

+0

你可能需要指定的內容類型...在這裏看到:https://docs.python.org/3/library/urllib.request.html#urllib.request.Request ..如果你不指定一個內容類型,它將默認爲application/x-www-form-urlencoded,這不是你發送的內容。如果您不介意使用外部庫,請求(http://docs.python-requests.org/en/master/)使這更簡單一些... –

+0

您可以提供數據對象的示例嗎?你傳遞給ElasticSearch?順便說一句我使用請求庫查詢到ES。這非常簡單。只是好奇 - 爲什麼使用Kibana來創建有效載荷(數據),並且一旦你通過了400,你打算如何處理這個響應? – jlaur

+0

@CorleyBrigman:我希望我可以使用請求庫。不幸的是,我在高度安全的環境中工作,他們非常不願意安裝任何超出嚴格要求的東西。 – eins6180

回答

0

隨着請求你可以做兩件事情

1)要麼你創建的JSON字符串表示反對自己,並把它關閉,像這樣一個:

payload = {'param': 'value'} 
response = requests.post(url, data=json.dumps(payload)) 

2)或者你有要求爲你做它像這樣:

payload = {'param': 'value'} 
response = requests.post(url, json = payload) 

所以這取決於究竟是什麼出來的sys.stdin呼叫(可能的 - 作爲Kibana將發送,如果目標是ElasticSearch - 一個json對象的字符串表示,相當於在字典上執行json.dumps),但您可能需要根據sys.stdin的輸出進行調整。

我的猜測是,你的代碼可以通過只是在做這樣的工作:

import sys 
import requests 
payload = sys.stdin 
response = requests.post('http://localhost:9200/_search', data=payload) 

如果你再想要做在Python用了一些工作,要求有一個內置的這種支持也。你只是這樣稱呼:

json_response = response.json() 

希望這可以幫助你走上正確的軌道。爲進一步閱讀om json.dumps/loads - this answer有一些好東西在上面。

+0

謝謝!如果我無法使用urllib處理腳本,我會嘗試說服他們安裝請求。但我非常懷疑他們會遵循這個建議。 – eins6180

+0

Aaah。看看這個SO問題如何使用urllib然後使用json有效內容執行POST請求:https://stackoverflow.com/a/4998300/8240959以及這一個https://stackoverflow.com/a/9746432/8240959 – jlaur