私はコンテンツのコーパスを索引付けするためにEC2インスタンス上でElasticsearchの実装を使って公開したRESTful APIを持っています。私の端末(MacOSX)から次のコマンドを実行して検索を問い合わせることができます。
curl -XGET 'http://ES_search_demo.com/document/record/_search?pretty=true' -d '{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}'
どのようにしてpython/requests
またはpython/urllib2
を使ってAPIリクエストに変換することができますか(どちらを選ぶべきかわからない - urllib2を使っていましたが、リクエストはもっと良いと聞きます...)。ヘッダーとして渡しますか、それともそうでないのですか?
リクエスト :を使う
import requests
url = 'http://ES_search_demo.com/document/record/_search?pretty=true'
data = '''{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}'''
response = requests.post(url, data=data)
APIがどのような応答を返すかに応じて、おそらくresponse.text
またはresponse.json()
を調べることになるでしょう(あるいはおそらく最初にresponse.status_code
を調べる)。クイックスタートドキュメント ここ 、特に このセクション を参照してください。
requests および json を使用すると簡単になります。
json.loads
関数を使用してJSONオブジェクトをPython辞書に解析します。要求 モジュールは成功と失敗を繰り返すための便利な機能を提供します。
if(Response.ok)
:API呼び出しが成功したかどうかを判断するのに役立ちます(応答コード - 200)
Response.raise_for_status()
はAPIから返されるhttpコードを取得するのに役立ちます。
以下は、そのようなAPI呼び出しを行うためのサンプルコードです。 github にもあります。このコードは、APIがダイジェスト認証を利用することを前提としています。これをスキップするか、他の適切な認証モジュールを使用してAPIを呼び出すクライアントを認証することができます。
#Python 2.7.6
#RestfulClient.py
import requests
from requests.auth import HTTPDigestAuth
import json
# Replace with the correct URL
url = "http://api_url"
# It is a good practice not to hardcode the credentials. So ask the user to enter credentials at runtime
myResponse = requests.get(url,auth=HTTPDigestAuth(raw_input("username: "), raw_input("Password: ")), verify=True)
#print (myResponse.status_code)
# For successful API call, response code will be 200 (OK)
if(myResponse.ok):
# Loading the response data into a dict variable
# json.loads takes in only binary or string variables so using content to fetch binary content
# Loads (Load String) takes a Json file and converts into python data structure (dict or list, depending on JSON)
jData = json.loads(myResponse.content)
print("The response contains {0} properties".format(len(jData)))
print("\n")
for key in jData:
print key + " : " + jData[key]
else:
# If response code is not ok (200), print the resulting http error code with description
myResponse.raise_for_status()
そのため、GETリクエストの本文にデータを渡したいのであれば、POST callで行うほうがよいでしょう。両方の要求を使用してこれを達成できます。
生のリクエスト
GET http://ES_search_demo.com/document/record/_search?pretty=true HTTP/1.1
Host: ES_search_demo.com
Content-Length: 183
User-Agent: python-requests/2.9.0
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate
{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}
リクエスト付きサンプルコール
import requests
def consumeGETRequestSync():
data = '{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}'
url = 'http://ES_search_demo.com/document/record/_search?pretty=true'
headers = {"Accept": "application/json"}
# call get service with headers and params
response = requests.get(url,data = data)
print "code:"+ str(response.status_code)
print "******************"
print "headers:"+ str(response.headers)
print "******************"
print "content:"+ str(response.text)
consumeGETRequestSync()
下記はpython-で残りのapiを実行するプログラムです。
import requests
url = 'https://url'
data = '{ "platform": { "login": { "userName": "name", "password": "pwd" } } }'
response = requests.post(url, data=data,headers={"Content-Type": "application/json"})
print(response)
sid=response.json()['platform']['login']['sessionId'] //to extract the detail from response
print(response.text)
print(sid)