가오리의 코딩일기

Ep07. Flask로 첫 번째 HTTP API 구축하기 본문

Python/flask

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

류경혜 2022. 8. 20. 00:00

💡 간단한 HTTP API를 구축하는 과정

🧩 app.py

더보기
from flask import Flask
app = Flask(__name__)

"""
POST: 클라이언트가 보낸 데이터를 받는 데에 사용
GET: 데이터를 다시 돌려주는 데에만 사용
/shop                         : 새로운 shop을 생성하거나 shop 목록을 보여준다
/shop/smith-flower-shop       : shop들 중, smith-flower-shop이라는 이름을 가진 것을 보여준다
/shop/smith-flower-shop/item  : smith-flower-shop에 새로운 item을 생성하거나 smith-flower-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()

 

 

 

 

🧩 shop_list, get_shop_list

# 리스트(shop_list)안에 딕셔너리가, 키(items) 안에 리스트가 있고 그 안에 딕셔너리가 존재
# shop_list는 파이썬의 자료구조, JSON 형식으로 바꾸어주는 작업이 필요함 -> jsonify
shop_list = [
    {
        'name': 'Smith flower store',
        'items': [
            {
                'name': '물망초',
                'price': '1200',
            }
        ]
    },
]
# GET /shop : shop의 목록들을 보여준다
@app.route('/shop', methods=['GET'])
def get_shop_list():
    return jsonify(shop_list)

 

 

 

🧩 app.config

app.config['JSON_AS_ASCII'] = False
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True

 

 

 

🧩 get_shop_list 수정

# GET /shop : shop의 목록들을 보여준다
@app.route('/shop', methods=['GET'])
def get_shop_list():
    return jsonify({'shop_list':shop_list})

 

 

 

🧩 postman보다 Insomnia 편한 것 같아서 Insomnia를 사용했습니다

The API Design Platform and API Client

 

The API Design Platform and API Client

Leading Open Source API Client, and Collaborative API Design Platform for REST, SOAP, GraphQL, and GRPC

insomnia.rest

 

 

🧩 get_shop_detail

# GET /shop/<string:shop_name> : name에 맞는 shop을 보여준다
@app.route('/shop/<string:shop_name>', methods=['GET'])
def get_shop_detail(shop_name):
    for shop in shop_list:
        if shop['name'] == shop_name:
            return jsonify(shop)
    return jsonify({'message':'shop not found'})

 

 

 

🧩 get_item_list_in_shop

@app.route('/shop/<string:shop_name>/item', methods=['GET'])
def get_item_list_in_shop(shop_name):
    for shop in shop_list:
        if shop['name'] == shop_name:
            return jsonify({'items':shop['items']})

 

 

 

🧩 create_item_in_shop

@app.route('/shop/<string:shop_name>/item', methods=['POST'])
def create_item_in_shop(shop_name):
    request_data = request.get_json()
    for shop in shop_list:
        if shop['name'] == shop_name:
            new_item = {
                'name': request_data['name'],
                'price': request_data['price']
            }
            shop['items'].append(new_item)
            return jsonify(new_item)
    return jsonify({'message':'shop not found'})

 

 

 

 

 

💡 HTTP란 무엇인가?

HTTP | MDN

 

HTTP | MDN

하이퍼텍스트 전송 프로토콜(HTTP)은 HTML과 같은 하이퍼미디어 문서를 전송하기위한 애플리케이션 레이어 프로토콜입니다. 웹 브라우저와 웹 서버간의 커뮤니케이션을위해 디자인되었지만, 다

developer.mozilla.org

🧩  HyperText Transfer Protocol란?

→ 초기에는 HTML과 같은 하이퍼미디어 문서를 주로 전송했다

 최근에는 Plain text, JSON, XML 등 다양한 형태의 정보도 전송하는 애플리케이션 레이어 프로토콜이다

→ 현재 우리가 사용하고 있는 서비스(이메일, 웹, 텍스트 메시지, 유튜브, 넷플릭스 등)들을 제공하는 계층

 

 

 

🧩  HTTP의 동작 방식

클라이언트: 서버에게 요청을 보내는 리소스 사용자 ex) 웹 브라우저, 모바일 애플리케이션, IoT
서버: 클라이언트에게 요청에 대한 응답을 제공하는 리소스 관계자

→ 클라이언트가 브라우저를 통해 어떠한 서비스를 URI를 통해 서버에 요청하면 서버에서는 해당 요청에 대한 결과를 응답하는 형태로 동작한다

 

 

 

 

 

💡 여러가지 HTTP Verbs

HTTP 요청 메서드 - HTTP | MDN

 

HTTP 요청 메서드 - HTTP | MDN

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부

developer.mozilla.org

✏️  GET

→ 특정 리소스를 받기 위한 요청, 리소스의 생성, 수정 및 삭제 등에 사용해서는 안 된다

 

✏️ POST

→ 리소스를 생성하거나 컨트롤러를 실행하는 데 사용한다

 

✏️ PUT

→ 변경 가능한 리소스를 업데이트하는 데 사용, 항상 리소스 식별 정보를 포함해야 한다

 

✏️ PATCH

→ 변경 가능한 리소스의 부분 업데이트에 사용, 항상 리소스 식별 정보를 포함해야 한다

PUT을 사용해 전체 객체를 업데이트하는 것이 관례여서 거의 사용되지 않는다.

 

✏️ DELETE

→ 특정 리소스를 제거하는 데 사용, 일반적으로 Request body가 아닌 URI 경로에 제거하려는 리소스의 ID를 전달한다.

 

✏️ HEAD

→ 클라이언트가 본문없이 리소스에 대한 헤더만 검색하는 경우에 사용한다

일반적으로 클라이언트가 서버에 리소스가 있는지 확인하거나 메타 데이터를 읽으려는 때만 GET 대신 사용한다

 

✏️ OPTIONS

→ 클라이언트가 서버의 리소스에 대한 수행 가능한 동작을 알아보기 위해 사용한다

일반적으로 서버는 이 리소스에 대해 사용할 수 있는 HTTP 요청 메소드를 포함하는 Allow 헤더를 반환한다

 

 

 

💡 REST 원칙

REST - 용어 사전 | MDN

 

REST - 용어 사전 | MDN

**REST(**Representational State Transfer)는 효율적, 안정적이며 확장가능한 분산시스템을 가져올 수 있는소프트웨어 아키텍처 디자인 제약의 모음을 나타냅니다. 그리고 그 제약들을 준수했을 때 그 시

developer.mozilla.org

[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog

 

[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

🧩  REpresentational State Transfer란?

HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다

→ 소프트웨어 아키텍처 디자인 제약의 모음

→ 애플리케이션을 설계, 제작하는데 사용하는 패턴과 기술의 총칭

🔗  CRUD: CREATE, READ, UPDATE, DELETE

→ CREATE[POST], READ[GET], UPDATE[PUT], DELETE[DELETE ]

 

🧩  REST의 구성요소

✏️ 자원(Resource): URI

→ 모든 자원에 고유한 ID가 존재하고 이 자원은 서버에 존재한다

→ 자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URI다

→ 클라이언트는 URI를 이용해 자원을 지정하고 해당 자원의 상태에 대한 조작을 서버에 요청한다

 

✏️ 행위(Verb): HTTP Method

→ HTTP 프로토콜의 Method를 사용한다

→ HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다

 

✏️ 표현(Representation of Resource)

→ 클라이언트가 자원의 상태에 대한 조작을 요청하면 서버는 이에 적절한 응답을 보낸다

→ REST에서 하나의 자원은 JSON, XML 등 여러 형태로 나타내어 질 수 있다