Skip to content

练习 — 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/gin
  • r := 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/v5
  • POST /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 /healthGET /api/v1/devicesGET /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

学习导航

上一篇:Middleware、Validation、CORS · 对应知识文档 · 下一篇:SQL 基础与表设计