Python을 사용하여 RESTful API에 요청하기
EC2 인스턴스에서 Elastic Search를 구현하여 콘텐츠의 말뭉치를 인덱싱한 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": {}
}'
위의 내용을 API 요청으로 변환하려면 어떻게 해야 합니까?python/requests
또는python/urllib2
(어느 쪽을 선택해야 할지 잘 모르겠습니다.urlib2를 사용하고 있습니다만, 요청이 더 좋다고 들었습니다만...?)헤딩으로 통과해야 하나요?
요청 사용:
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
첫 번째)를 참조해 주세요.여기서 퀵스타트 문서를 참조해 주세요.특히 이 섹션을 참조해 주세요.
- API 호출
- API가 JSON을 반환한다고 가정하면, JSON 개체를 Python dict로 해석합니다.
json.loads
기능. - 정보를 추출하려면 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()
다음은 python-에서 rest 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)
따라서 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()
언급URL : https://stackoverflow.com/questions/17301938/making-a-request-to-a-restful-api-using-python
'programing' 카테고리의 다른 글
PHPMyAdmin 오류: #126 - 테이블의 잘못된 키 파일 (0) | 2022.11.29 |
---|---|
대소문자를 구분하지 않는 교환 (0) | 2022.11.29 |
mysqld를 정지하는 방법 (0) | 2022.11.29 |
동적 계산 속성 이름 (0) | 2022.11.29 |
YYYMMDD 형식으로 주어진 생년월일을 계산합니다. (0) | 2022.11.29 |