2013-06-25 2 views
109

EC2 인스턴스에서 Elasticsearch 구현을 사용하여 노출 된 RESTful API를 사용하여 콘텐츠 코퍼스를 색인화합니다. , urllib2를 사용하고있다 - 나는 (python/requests 또는 python/urllib2를 사용하여 API 요청으로 위 갈 수있는 하나 확실하지 켜 어떻게Python을 사용하여 RESTful API에 요청하기

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": {} 
}' 

: 나는 내 터미널 (에서라도)에서 다음을 실행하여 검색을 조회 할 수 있습니다 요청이 더 좋다고 들으면 ...)? 머리글 또는 기타로 전달합니까? requests를 사용

답변

179

:

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 첫번째 검사). 빠른 시작 문서 here, 특히 this section을 참조하십시오.

+3

나는 그것이 같아야한다고 생각한다 : response = requests.post (url, data = data) –

+4

"requests.get"은 "data"매개 변수를 취하지 않는다.선택적 "params"매개 변수를 취할 수 있습니다.이 매개 변수는 대개 쿼리 문자열을 전달하는 dict입니다. 데이터를 가져 오기 위해 페이로드가 필요한 경우 (예 : 게시 된 예제) "requests.post"를 사용해야합니다. 또한 "json"라이브러리를 사용하면 json 응답을 더 쉽게 파싱 할 수 있습니다. – HVS

+2

python 3에서 작동합니까? –

55

requestsjson을 사용하면 간단 해집니다.

  1. 전화 API를 가정하고 API
  2. 정보를 추출하기 위해 DICT를 통해 json.loads 기능을
  3. 루프를 사용하여 파이썬 딕셔너리로 ​​JSON 개체를 구문 분석하는 JSON을 반환합니다.

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() 
+1

마지막 JSON 문서는 배열을 최상위 요소로 가질 수 있기 때문에 키를 반복하는 부분이 항상 작동하지는 않습니다. 그래서,'jData [key]'를 얻으려고하면 에러가 될 것입니다 –

+0

@DenisTheMenace 배열이라면 어떻게 처리할까요? – qasimalbaqali

+0

@qasimalbaqali 사전 순회 법과 동일합니다. 그러나 배열 요소는 단순히'jData'가 아니라'jData'가 될 것입니다. –

8

GET 요청 본문에 데이터를 전달하려면 POST 호출에서 데이터를 전달하는 것이 좋습니다. 두 요청을 모두 사용하여이 작업을 수행 할 수 있습니다. 요청

원시 요청

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() 

아래 [http://stackandqueue.com/?p=75]

+0

거기에 죽은 링크가 있어요. – user3157940

0

에 요청을 사용하여 더 많은 통화를 확인할 수는 파이썬에서 나머지 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) 
관련 문제