2017-07-06 21 views
0

Python 3モジュールurllibを使用して、localhost:9200のElasticsearchデータベースにアクセスします。私のスクリプトは、JSON形式でSTDINにパイプされた有効なリクエスト(Kibanaによって生成)を取得します。ここでPython 3でのElasticsearchへのアクセス

は私がやったことです:

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()自体があまり意味がありませんが、私はちょうどそれをシンプルに保つために望んでいたことを理解し)

私は、スクリプトを実行すると、私はそれが印刷され、弾にcurlを経由して、それを与えていたので、私はスクリプトに配管よJSONデータは、正しいことを非常に確信して

HTTP Error 400: Bad request 

を取得しますicsearch、そして戻ってくると期待していた書類を手に入れました。

私が間違っていたアイデアはありますか? urllibを正しく使用していますか? urlencode行のJSONデータを混乱させるのですか?私はElasticsearchに正しく照会していますか?

ありがとうございました。あなたは二つのこと

1のいずれかを実行することができます要求に

+0

おそらくコンテンツタイプを指定する必要があります。こちらをご覧ください:https://docs.python.org/3/library/urllib.request.html#urllib.request.Request ..指定しない場合content-typeの場合、デフォルトでapplication/x-www-form-urlencodedになります。これは送信したものではありません。外部ライブラリを使用しても構わない場合は、リクエスト(http://docs.python-requests.org/ja/master/)を参照してください。 –

+0

データオブジェクトの例を教えてください。 ElasticSearchに渡しますか? Btw私はESへのクエリのためのリクエストライブラリを使用します。それは非常に簡単です。ちょうど好奇心 - なぜペイロード(データ)を作成するために木場を使用し、あなたが一度400を渡すと応答で何をするつもりですか? – jlaur

+0

@CorleyBrigman:リクエストライブラリを使用したいと思います。残念ながら、私は高度なセキュリティ環境で作業しており、厳密に必要なものを何かインストールすることは非常に嫌です。 – eins6180

答えて

0

)あなた自身をオブジェクトなどのようにそれをオフに送信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。 urllibを使用してjsonペイロードでPOSTリクエストを行う方法についてのこの質問をチェックしてください:https://stackoverflow.com/a/4998300/8240959これとhttps://stackoverflow.com/a/9746432/8240959 – jlaur

関連する問題