본문 바로가기

Flask-Study

Ep07 : Flask로 첫 번째 HTTP API 구축하기

HTTP(Hypertext Transfer Protocol)란 무엇인가?

HTML과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 레이어 프로토콜로 클라이언트들이 어떻게 서버와 통신할 수 있는지를 정의한 것이기도 하다. 클라이언트와 서버에게 데이터를 요정(request)하면 서버는 요청에 맞는 응답(response)을 클라이언트에게 보내주는 방식이다.

 

여러가지 HTTP Verbs

HTTP는 요청 메소드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타낸다.

GET -> 특정 리소스릐 표시를 요청, 오직 데이털르 받기만 한다.

POST -> 리소스를 생성/업데이트 하기 위해 서버에 데이터를 보내는데 사용된다.

PUT -> 요청된 자원을 수정, 전체적인 정보를 수정할 때 쓰인다.

PATCH -> 요청된 자원을 수정하는 것은 PUT과 같은 기능이지만 PATCH는 일부 정보를 수정할 때 쓰인다.

DELETE -> 요청된 자원을 삭제 요청한다.

 

REST(Representational State Transfer) 원칙

REST - URI를 통해 자원을 표시하고, HTTP Method를 이용하여 해당 자원의 행위를 규정하여 그 결과를 받는 것

  • 자원(Resource) : URI
    • 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
    • 자원을 구별하는 ID는 'groups/:group_id'와 같은 HTTP URI다.
    • Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.
  • 행위(Verb) : HTTP Method
    • HTTP 프로토콜의 Method를 사옹한다.
    • HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메소드를 제공한다.
  • 표현(Representations)
    • Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
    • REST에서 하나의 자원은 JSON, XML, TEXT, RSS등 여러 형태의 Representation으로 나타내어 질 수 있다.

 

간단한 HTTP API 구축해 보기

프로젝트를 하나 생성해서 app.py에 아래 코드를 작성해 준다.

 

from flask import Flask

app = Flask(__name__)


'''
서버의 입장에서,
POST -  클라이언트가 보낸 데이터를 받는 데에 사용한다.
GET  -  데이터를 다시 돌려주는 데에만 사용한다.
'''

# 아래에서 다룰 리소스들 : shop, item

# POST /shop -> name 이라는 데이터를 받아서, 새로운 shop을 생성함
@app.route('/shop', methods=['POST'])
def create_shop():
    pass

# GET  /shop/<string:shop_name> -> name 에 맞는 shop 을 보여줌
@app.route('/shop/<string:shop_name>', methods=['GET'])
def get_shop_detail():
    pass

# GET  /shop -> shop의 목록들을 보여줌
@app.route('/shop', methods=['GET'])
def get_shop_list():
    pass

# POST /shop/<string:shop_name>/item -> item_name, price 를 받아서, name에 맞는 shop에 새로운 item을 추가
@app.route('/shop/<string:shop_name>/item', methods=['POST'])
def create_item_in_shop():
    pass

# GET  /shop/<string:shop_name>/item -> shop에 들어있는 item들의 목록을 반환
@app.route('/shop/<string:shop_name>/item', methods=['GET'])
def get_item_list_in_shop(shop_name):
    pass

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

 

데이터베이스를 사용하는 대신 파이썬의 리스트로 shop들을 저장해 보자

 

 

이제 이 리스트를 JSON 형식으로 바꾸어 줄 것이다. Flask에서는 이 작업을 jsonify 라는 메소드를 통해 지원한다.

이를 이용하여 get_shop_list를 수정해 준다.

 

 

그리고 실행하여 /shop 에 접속하면 아래와 같은 결과가 나온다.

 

 

JSON 형식으로 응답된것도 확인할 수 있다.

 

 

그런데 이름 부분이 깨지는 현상이 나타난다. 이를 해결하기 위해 아래 코드를 추가해 준다. 그리고 실행해 보면 다음과 같은 결과가 나온다.

 

 

 

그리고 조금 더 데이터를 편하게 쓸 수 있도록 JSON에 key를 하나 추가해 준다.

 

 

shop 생성 구현하기

생성을 구현하기 위해서 create_shop을 아래처럼 코드를 수정해 준다.

 

 

그리고 Postman을 사용하여 POST 요청을 보내준다.

 

 

터미널에도 성공적으로 보이는것을 확인할 수 있다.

 

 

shop 상세 조회 구현하기

shop/샵 이름 으로 요청했을 때 해당 이름에 맞는 shop에 대한 상세정보를 리턴해 주도록 구현할 것이다. get_shop_detail 부분을 수정해 주고 shop들을 몇개 추가해 준다.

 

 

 

그리고 Postman에서 요청을 보내면 아래와 같은 결과가 나온다.

 

 

shop item 목록 조회 구현하기

get_item_list_in_shop 부분을 수정해 준다.

 

 

Postman에서 위 주소로 요청을 보내면 item들의 목록이 잘 리턴된 것을 볼 수 있다.

 

 

Item 생성 구현하기

create_item_in_shop을 아래와 같이 수정해 준다.

 

 

postman을 통해서 POST 요청으로 생성해 주고 다시 GET 요청을 하면 성공적으로 생성된 것을 확인할 수 있다.