← 課程總覽

🔌 第9堂課:API 開發入門

程式學習第九堂課:REST API 概念、Flask 框架、CRUD 待辦事項 API、schedule 自動化排程
含語音講解(約 60 分鐘),附互動小測驗

📖 第一階段:REST API(約 20 分鐘)

1. 什麼是 API?

⏱ 10 分鐘

API 就是兩個程式之間的溝通介面。REST API 用 HTTP 方法表達操作:

GET    /api/todos      → 取得所有
POST   /api/todos      → 新增
PUT    /api/todos/3    → 更新第 3 筆
DELETE /api/todos/3    → 刪除第 3 筆

2. Flask 快速上手

⏱ 15 分鐘
# pip install flask
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route("/api/hello")
def hello():
    name = request.args.get("name", "陌生人")
    return jsonify({"greeting": f"哈囉,{name}!"})

@app.route("/api/echo", methods=["POST"])
def echo():
    data = request.get_json()
    return jsonify({"你傳送了": data})

if __name__ == "__main__":
    app.run(debug=True, port=5000)

📖 第二階段:完整 CRUD(約 25 分鐘)

3. 待辦事項 API

⏱ 20 分鐘
from flask import Flask, jsonify, request, abort

app = Flask(__name__)
todos = []; next_id = 1

@app.route("/api/todos", methods=["GET"])
def get_todos():
    return jsonify(todos)

@app.route("/api/todos", methods=["POST"])
def create_todo():
    global next_id
    data = request.get_json()
    todo = {"id": next_id, "title": data["title"], "done": False}
    next_id += 1; todos.append(todo)
    return jsonify(todo), 201

@app.route("/api/todos/", methods=["DELETE"])
def delete_todo(todo_id):
    global todos
    todos = [t for t in todos if t["id"] != todo_id]
    return jsonify({"message": "已刪除"})

📖 第三階段:自動化(約 15 分鐘)

4. 自動化排程

⏱ 10 分鐘
# pip install schedule
import schedule, time

def daily_task():
    print("執行每日任務...")

schedule.every().day.at("09:00").do(daily_task)

while True:
    schedule.run_pending()
    time.sleep(30)
🚀 你現在可以:建立 API → 用戶透過網路存取 → 自動化排程背景執行。

🔍 Flask REST API 實戰

⏱ 15 分鐘
from flask import Flask, request, jsonify

app = Flask(__name__)

todos = [
    {"id": 1, "title": "學 Python", "done": True},
    {"id": 2, "title": "寫 API", "done": False},
]

@app.route("/api/todos", methods=["GET"])
def get_todos():
    return jsonify(todos)

@app.route("/api/todos", methods=["POST"])
def create_todo():
    data = request.get_json()
    new_id = max(t["id"] for t in todos) + 1 if todos else 1
    todo = {"id": new_id, "title": data["title"], "done": False}
    todos.append(todo)
    return jsonify(todo), 201  # 201 Created

@app.route("/api/todos/", methods=["PUT"])
def update_todo(todo_id):
    data = request.get_json()
    for todo in todos:
        if todo["id"] == todo_id:
            todo.update(data)
            return jsonify(todo)
    return jsonify({"error": "找不到"}), 404

if __name__ == "__main__":
    app.run(debug=True, port=5000)
🚀 REST API 命名慣例:資源用複數名詞、HTTP method 表示動作
🔢 狀態碼:200 OK、201 Created、404 Not Found

🔍 API 安全與進階主題

⏱ 8 分鐘
from flask_cors import CORS
CORS(app, origins=["https://jiu-tao.com"])

# 簡單的 API Key 驗證
API_KEYS = {"abc123": "admin", "xyz789": "user"}

from functools import wraps
def require_api_key(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        key = request.headers.get("X-API-Key")
        if key not in API_KEYS:
            return jsonify({"error": "未授權"}), 401
        return f(*args, **kwargs)
    return decorated
🔐 API 安全三要素:認證、授權、速率限制
📖 下一步:FastAPI(更現代)、Swagger 文件、SQLAlchemy 資料庫

🧪 小測驗:你學會了嗎?

5 題選擇題,選完按「交卷」看成績
第 1 / 5 題
REST API 中 GET 方法用來做什麼?
第 2 / 5 題
Flask 中 @app.route 是什麼?
第 3 / 5 題
jsonify() 的作用?
第 4 / 5 題
CRUD 代表哪四個操作?
第 5 / 5 題
schedule.every().day.at() 做什麼?
你的得分
0/5

🎯 第9堂課,你學會了什麼?

REST APIFlask完整 CRUD自動化排程

你現在可以建立自己的後端服務了——API 是現代軟體的骨架。

→ 前往第10堂課