programing

Python을 사용하여 RESTful API에 요청하기

goodsources 2022. 11. 29. 21:49
반응형

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첫 번째)를 참조해 주세요.여기서 퀵스타트 문서를 참조해 주세요.특히 이 섹션을 참조해 주세요.

요청 및 json을 사용하면 작업이 단순해집니다.

  1. API 호출
  2. API가 JSON을 반환한다고 가정하면, JSON 개체를 Python dict로 해석합니다.json.loads기능.
  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()

다음은 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

반응형