가오리의 코딩일기
Ep07. Flask로 첫 번째 HTTP API 구축하기 본문
💡 간단한 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
🧩 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란 무엇인가?
🧩 HyperText Transfer Protocol란?
→ 초기에는 HTML과 같은 하이퍼미디어 문서를 주로 전송했다
→ 최근에는 Plain text, JSON, XML 등 다양한 형태의 정보도 전송하는 애플리케이션 레이어 프로토콜이다
→ 현재 우리가 사용하고 있는 서비스(이메일, 웹, 텍스트 메시지, 유튜브, 넷플릭스 등)들을 제공하는 계층
🧩 HTTP의 동작 방식
클라이언트: 서버에게 요청을 보내는 리소스 사용자 ex) 웹 브라우저, 모바일 애플리케이션, IoT
서버: 클라이언트에게 요청에 대한 응답을 제공하는 리소스 관계자
→ 클라이언트가 브라우저를 통해 어떠한 서비스를 URI를 통해 서버에 요청하면 서버에서는 해당 요청에 대한 결과를 응답하는 형태로 동작한다
💡 여러가지 HTTP Verbs
✏️ GET
→ 특정 리소스를 받기 위한 요청, 리소스의 생성, 수정 및 삭제 등에 사용해서는 안 된다
✏️ POST
→ 리소스를 생성하거나 컨트롤러를 실행하는 데 사용한다
✏️ PUT
→ 변경 가능한 리소스를 업데이트하는 데 사용, 항상 리소스 식별 정보를 포함해야 한다
✏️ PATCH
→ 변경 가능한 리소스의 부분 업데이트에 사용, 항상 리소스 식별 정보를 포함해야 한다
→ PUT을 사용해 전체 객체를 업데이트하는 것이 관례여서 거의 사용되지 않는다.
✏️ DELETE
→ 특정 리소스를 제거하는 데 사용, 일반적으로 Request body가 아닌 URI 경로에 제거하려는 리소스의 ID를 전달한다.
✏️ HEAD
→ 클라이언트가 본문없이 리소스에 대한 헤더만 검색하는 경우에 사용한다
→ 일반적으로 클라이언트가 서버에 리소스가 있는지 확인하거나 메타 데이터를 읽으려는 때만 GET 대신 사용한다
✏️ OPTIONS
→ 클라이언트가 서버의 리소스에 대한 수행 가능한 동작을 알아보기 위해 사용한다
→ 일반적으로 서버는 이 리소스에 대해 사용할 수 있는 HTTP 요청 메소드를 포함하는 Allow 헤더를 반환한다
💡 REST 원칙
[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog
🧩 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 등 여러 형태로 나타내어 질 수 있다
'Python > flask' 카테고리의 다른 글
Ep08. Flask-RESTful로 Animal CRUD API 구축하기 (0) | 2022.08.31 |
---|---|
Ep04. 블로그 웹 애플리케이션 개발(1) (0) | 2022.07.22 |
Ep03. 블로그 웹 애플리케이션 개발 (0) | 2022.07.15 |
Ep02. python DB API, sqlite3 (0) | 2022.07.10 |
Ep02. 라우팅, 변수 규칙, 후행 슬래시, url 구축, http 메소드 (0) | 2022.07.09 |