2021년 3월 7일 일요일

python REST API



간단하게 REST API가 뭔지에 대해 알아보고 python에서 REST API를 사용하려면 뭘이용해야하는지 간단한 예제를 들어서 구현해보겠습니다. 

REST API를 이용할 테스트 서버를 구할 수 없기 때문에 여기에서는 Flask를 이용하여 구현하였습니다.


정의 

REST(Representational State Transfer) http 프로토콜 위에 사용하는 간단한 인터페이스

모든 http 서비스가 REST를 지원하는것은 아님, 서버가 REST를 지원해줘야함



용어

1. 자원(Resource) , URI, http의 주소를 의미함

모든 자원은 고유한 ID를 가지고 ID는 서버에 존재하고 클라이언트는 각 자원의 상태를 조작하기 위해 요청을 보낸다. HTTP에서 이러한 자원을 구별하는 ID는 url 주소 뒤쪽에 HTTP URI 이다.


2. 행위(Verb) , Method, 웹페이지를 요청할때 행동을 의미

클라이언트는 URI를 이용해 자원을 지정하고 자원을 조작하기 위해 Method를 사용한다. HTTP 프로토콜에서는 GET , POST , PUT , DELETE 같은 Method를 제공

아래와 같은 동작을 지원함

CRUD Operation , HTTP Method

Create : POST (자원 생성)

Read : GET (자원의 정보 조회)

Update : PUT (자원의 정보 업데이트)

Delete : DELETE (자원 삭제)

구현에 도움 되는 링크 : https://realpython.com/api-integration-in-python/


특히 URL에 대해서 어떻게 해야하는것인지는 아래 표내용을 참고하기 바랍니다.

HTTP methodAPI endpointDescription
GET/customersGet a list of customers.
GET/customers/<customer_id>Get a single customer.
POST/customersCreate a new customer.
PUT/customers/<customer_id>Update a customer.
PATCH/customers/<customer_id>Partially update a customer.
DELETE/customers/<customer_id>Delete a customer.


python requests에서는 아래와 같은 형태로 모두 준비가 되어 있습니다. 따라서 아래와 같이 호출하면서 사용하면 되며, POST,PUT,PATCH 의 경우 URI외에 추가 정보를 전달할 필요가 있는 항목에 대해서는 json이나 data인자를 이용하여 데이터를 전달하면 됩니다.

    requests.post(API endpoint)

    requests.get(API endpoint)

    requests.put(API endpoint)

    requests.patch(API endpoint)

    requests.delete(API endpoint)


3. 표현(Representation) http의 post/get 시 리턴되는 값을 의미한다. 결론은 어떠한 형태로든 리턴이 될 수 있음. 표준화 되어 있지 않음

클라이언트가 서버로 요청을 보냈을 때 서버가 응답으로 보내주는 자원의 상태를 Representation이라고 한다. REST에서 하나의 자원은 JSON , XML , TEXT , RSS 등





사용법

python에서는 간단하게 http 주소 호출하는 requests를 사용하여 사용

그전에 Python에서 POST/GET 사용법은 기본이라서 꼭 알고 넘어가세요. 다음 링크 참고

https://swlock.blogspot.com/2021/10/python-postget-requests-requests.html


예제

간단한 서버 예제는 Flask 로 제작

Flask는 파이썬으로 작성된 마이크로 웹 프레임워크이다. 웹기반으로 웹서버는 아니므로 REST API를 제공하기 위한 서버라고 생각해도 좋습니다.


Flask 설치법

pip install flask


Flask server 예제

5_flask_simple_server.py

from flask import Flask, json

funs = [{"id": 1, "name": "fun1"}, {"id": 2, "name": "fun2"}]

api = Flask(__name__)

@api.route('/funs', methods=['GET'])
def get_funs():
  return json.dumps(funs), 200

@api.route('/funs', methods=['POST'])
def post_funs():
  return json.dumps({"success": True}), 201

if __name__ == '__main__':
    api.run(debug=True)

POST/GET를 만들었습니다. 위 내용을 참고하자면 의도상으로는 아래와 같습니다.

Create : POST (자원 생성) -> 여긴 sucess 라는 : True라는 것만 전달하고 있습니다.

만약 인자를 받아서 처리가 필요하다면 좀 더 구현이 필요한 부분입니다.

Read : GET (자원의 정보 조회) -> 여기 예제에서는 funs데이터를 json으로 전달하고 있습니다.


예제 설명

URI funs 를 get/put으로 요청시 json 포맷으로 리턴함


실행 화면

 * Serving Flask app "5_flask_simple_server" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 298-679-048
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [07/Mar/2021 20:59:49] "GET /funs HTTP/1.1" 200 -

클라이언트는 웹브라우저로 접속함 

http://127.0.0.1:5000/funs 

출력은 아래와 같은 형태로 표시됨 (text로 보낸것과 사실 별차이 없음)

[{"id": 1, "name": "fun1"}, {"id": 2, "name": "fun2"}]

브라우저는 GET으로 밖에 테스트를 못하기 때문에 위 결과가 출력됨


python api를 이용하여 구현시

import requests

resp = requests.get('http://127.0.0.1:5000/funs')
print(resp.status_code)
print(resp.text)

task = {"summary": "test", "description": "test" }
resp = requests.post('http://127.0.0.1:5000/funs', json=task)
print(resp.status_code)
print(resp.text)


결과

C:\example>python 5_flask_simple_client.py
200
[{"id": 1, "name": "fun1"}, {"id": 2, "name": "fun2"}]
201
{"success": true}


소스 코드는 아래 참고

https://github.com/donarts/sourcecode/tree/main/python/example

POST/GET은 기본이라서 여기 예제를 참고하세요.

https://swlock.blogspot.com/2021/10/python-postget-requests-requests.html

위는 POST/GET예제를 이용한 간단한 예제이며, 

모든 API를 이용한 예제입니다.

https://swlock.blogspot.com/2021/10/python-rest-api-2.html



댓글 없음:

댓글 쓰기