262

コンテンツのコーパスにインデックスを付けるために、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": {}
}'

上記を or を使用して API リクエストに変換するにはどうすればよいですpython/requestspython/urllib2(どちらを使用すればよいかわかりません - urllib2 を使用していますが、リクエストの方が優れていると聞いています...)。ヘッダーとして渡しますか?

4

4 に答える 4

114

requestsjsonを使用すると、簡単になります。

  1. API を呼び出す
  2. json.loadsAPI が JSON を返すと仮定すると、関数を使用して JSON オブジェクトを Python dict に解析します。
  3. dict をループして情報を抽出します。

Requestsモジュールは、成功と失敗をループする便利な機能を提供します。

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()
于 2015-09-22T16:23:57.450 に答える
10

以下は、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)
于 2017-05-18T10:12:47.483 に答える