# 第二堂:API 是什麼?介接外部服務自己來 * 記得錄影 * **下週一 21:00 釋出最終任務,將會有實際改 Code 與測試環節** * 即日起提供,[一對一諮詢連結](https://liberating-turtle-5a2.notion.site/2e16a246851880a28857c25c4df931b2),提供**課程介紹**與**學習方向**討論 * 獲得書籍同學,週五前填表者,將準時於週六日發送~ * [簡報模式](https://hexschool.github.io/backend-camp-game/dev) ## 課程結束後 * 21:30 準時提供實體活動報名連結 * 每日任務抽書活動 ## 第一部分:當你輸入網址按下 Enter,背後發生了什麼事? * 簡報:Day 5|拖曳排序:HTTP 請求流程 ### 你每天都在發網路請求! ``` 1. 瀏覽器發送「請求」(Request) 2. 請求透過網路傳送到伺服器 3. 伺服器處理請求 4. 伺服器回傳「回應」(Response) 5. 瀏覽器顯示結果 ``` **這個「一來一往」的過程,就叫做網路請求!** 你每天上網都在發網路請求: - 打開 Google 搜尋 - 看 YouTube 影片 - 滑 Instagram - 逛蝦皮購物 **通通都是網路請求!** ### 互動問題 > 請問大家:你今天打開過幾個網站?每打開一個網站,就是發了一次網路請求喔! --- ## 第二部分:API 基礎觀念 - 用別人的服務都靠他 ### 一般網址 vs API ### API 的全名 **API = Application Programming Interface(應用程式介面)** 簡單說:API 是程式與程式之間溝通的橋樑。 ### JSON 資料格式 JSON 是程式之間交換資料的標準格式: ```json { "name": "王小明", "age": 25, "skills": ["JavaScript", "Python", "Node.js"], "isStudent": false } ``` ### 實際的 API 回應長這樣 ```json { "success": true, "data": { "coaches": [ { "id": 1, "name": "海克絲", "role": "教練", "skills": ["重訓", "有氧", "瑜珈"] }, { "id": 2, "name": "李燕容", "role": "教練", "skills": ["皮拉提斯", "伸展"] } ] } } ``` --- ## 第三部分:資料流解析 ### LiveFit 有多少個 API? LiveFit 健身平台總共有 **29 個 API**! * [>>API文件<<](https://www.notion.so/38e4dd6775894e94a8f575f20ca5b867?pvs=21) * 以「教練新增一門課程為例」:Day 4|後端角色說明 * 顧客想觀看教練列表課:Day 5|API 實際操作示範 | 模組 | API 數量 | 功能範例 | |------|----------|----------| | 使用者 (users) | 7 個 | 註冊、登入、個人資料、修改密碼 | | 教練 (coaches) | 3 個 | 教練列表、教練詳情、教練課程 | | 課程 (courses) | 3 個 | 課程列表、預約課程、取消預約 | | 堂數方案 (credit-package) | 4 個 | 方案列表、購買堂數 | | 技能 (skill) | 3 個 | 技能列表、新增/刪除技能 | | 教練後台 (admin) | 8 個 | 開課、收益統計、課程管理 | | 上傳 (upload) | 1 個 | 圖片上傳 | **這就是後端工程師要做的事:設計並實作這些 API!** ### 完整的資料流 教練資料怎麼從資料庫跑到網頁上? ``` 前端發請求 → 後端處理 → 資料庫查詢 → 後端回傳 → 前端顯示 ``` **步驟拆解:** 1. **前端**:使用者看到的網頁,發送 API 請求 2. **後端**:接收請求,處理邏輯,連接資料庫 3. **資料庫**:儲存資料,回傳查詢結果 4. **後端**:把資料包成 JSON 回傳 5. **前端**:收到 JSON,顯示在畫面上 --- ## 第四部分:第三方服務串接 ### 後端工程師 = 中央調度站 * 簡報:Day 5|第三方 API 服務 後端工程師的工作不只是連接自己的資料庫,更多是「整合各種第三方服務」! | 服務類型 | 範例 | |---------|------| | 金流服務 | 綠界、藍新、LINE Pay | | 第三方登入 | Google、Facebook、Apple | | 簡訊/郵件通知 | Twilio、SendGrid | | 雲端儲存 | AWS S3、Google Cloud | | 地圖服務 | Google Maps API | **這些服務都有提供 API,後端工程師負責把它們「串」起來!** ### 實際案例:購買課程 當使用者在網站點擊「購買」: ``` 1. 點擊購買 → 前端送請求給後端 2. 後端呼叫金流 API → 建立訂單 3. 金流處理付款 → 通知後端成功 4. 更新資料庫 → 訂單狀態「已付款」 5. 購買成功! → 前端顯示結果 ``` ## 第五部分:API 權限驗證與 JWT * 簡報:Day 4|後端角色說明 * 簡報:Day 8 ### API 需要權限驗證 並非所有 API 都能隨意存取,涉及個人資料的操作都需要驗證身份: | API 類型 | 是否需要驗證 | 範例 | |---------|-------------|------| | 公開 API | 不需要 | 取得教練列表、課程列表 | | 私人 API | 需要 | 查看個人資料、購買課程、修改密碼 | ### HTTP 無狀態特性 HTTP 協定本身是「無狀態」的,伺服器不會記住每個請求來自誰。 **解決方案:JWT(JSON Web Token)** 登入成功後,伺服器發給使用者一張「通行證」,之後每次請求都帶著它。 ### JWT 運作原理(餐廳號碼牌比喻) > ### 為什麼無法偽造 - 簽名由後端的「秘密金鑰」產生 - 只有後端知道這個金鑰 - 竄改內容會導致簽名驗證失敗 ### 秘密金鑰的存放位置 | 做法 | 說明 | |-----|------| | ❌ 寫在程式碼 | 上傳 GitHub 後全世界都能看到 | | ✅ 放在 `.env` 檔案 | 用 `.gitignore` 防止上傳 | ``` # .env 檔案範例 JWT_SECRET=hexschool666 JWT_EXPIRES_DAY=30d ``` ### 前端儲存位置:LocalStorage vs Cookie | 特性 | LocalStorage | Cookie | |------|--------------|--------| | 容量 | 約 5MB | 約 4KB | | 自動帶上請求 | 否,需手動加入 Header | 是,自動送給伺服器 | | 過期時間 | 永久(除非手動刪除) | 可設定 | ### 使用 Chrome DevTools 查看 1. 按 `F12` 開啟開發者工具 2. 點選 `Application` 面板 3. 左側展開 `Storage → Local Storage` 4. 點擊網域名稱查看儲存的資料 ### 安全注意事項 - JWT 被竊取等於身份被冒用 - 離開電腦前記得鎖定螢幕 - Mac:`Cmd + Ctrl + Q` - Windows:`Win + L`