外观
练习 — Gin · JWT · API Design
对应知识点:
Gin·JWT·API Design对应文档:docs/phase-03-web/gin-jwt-api-design.md代码目录:workspace/phase-03/gin-api/
前置条件:完成 net/http 与 middleware 练习。
Level 1 — 基础
练习 1.1 · Gin Hello
在 workspace/phase-03/gin-api/ 初始化项目:
要求:
go get github.com/gin-gonic/ginr := gin.Default(),GET /health返回 JSON- 对比 net/http 写法,记录 3 点差异到
notes-gin.md
练习 1.2 · 路由分组
要求:
v1 := r.Group("/api/v1")- 注册
v1.GET("/devices", ...)和v1.GET("/devices/:id", ...) - 使用
c.Param("id")获取路径参数
练习 1.3 · 绑定与校验
要求:
- POST body 绑定到 struct,使用
binding:"required"tag - 绑定失败
c.JSON(400, gin.H{"error": ...}) - 成功返回 201 + 创建的资源
Level 2 — 应用
练习 2.1 · Gin 中间件
要求:
- 使用
r.Use()注册 logging 中间件 - 自定义中间件向 context 设置
requestId - Handler 中读取并返回在响应 header
练习 2.2 · JWT 登录
要求:
go get github.com/golang-jwt/jwt/v5POST /api/v1/auth/login接受 username/password(mock 校验)- 成功返回 JWT access token(HS256,secret 来自环境变量)
- token payload 含
sub(userId)、exp
练习 2.3 · JWT 鉴权
要求:
JWTAuth()中间件解析 Bearer token- 无效/过期返回 401
- 保护
GET /api/v1/admin/devices路由
Level 3 — 综合
练习 3.1 · 完整 CRUD
要求:
- Gin 实现 devices CRUD(内存 store)
- 统一响应 struct
- 分页、过滤 query 参数
- 错误映射:404 DEVICE_NOT_FOUND、400 VALIDATION_ERROR
练习 3.2 · 与 Vue 前端联调
要求:
- 配置 CORS(gin cors 中间件或手写)
- Vue 端登录存 token,请求带 Authorization
- 文档记录联调步骤与常见跨域/JWT 问题
Level 4 — 项目实践
练习 4.1 · Project 01 Gin 完整版
在 workspace/phase-03/gin-api/ 完成 Project 01 — Go REST API:
要求:
- 分层:handler / service / store(与 net/http 版一致或可复用)
- 公开:
GET /health、GET /api/v1/devices、GET /api/v1/devices/:id - 认证:
POST /auth/login、受保护的 admin 路由 - JWT + 中间件 + 校验 + CORS
models.go字段与 Web3D 前端 camelCase 一致- README:环境变量、启动、curl/Postman 示例、API 列表
- 作为 Phase 04 数据库层的 HTTP 入口
学习检查
- [ ] Gin 与 net/http 的性能/便利性权衡?
- [ ] JWT 无状态认证的优缺点?
- [ ] access token 应存前端哪里(localStorage vs cookie)?
- [ ] API 版本升级策略?
提交方式
检查答案 — gin jwt api design 练习 X.X