【Go】-- Gin框架基本使用
第一个Gin应用
代码示例
package mainimport "github.com/gin-gonic/gin"
func index(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello, world!",})
}func main() {gin.SetMode(gin.ReleaseMode)r := gin.Default()r.GET("/login", index)r.Run("0.0.0.0:1234")
}
核心概念
- gin.H:Gin框架提供的map[string]interface{}别名,用于构建JSON响应
- gin.Context:请求上下文,包含请求和响应信息
- 路由定义:使用
GET
、POST
等方法定义HTTP路由 - 服务器启动:
Run()
方法启动HTTP服务器
路由定义和处理
GET请求处理
engine.GET("/get_test", func(c *gin.Context){c.JSON(200, gin.H{"code": 200,"msg": "GET 请求成功",})
})
POST请求处理(JSON数据绑定)
engine.POST("/post_test", func(c *gin.Context){var user user.Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(400, gin.H{"code": 400,"msg": "POST 请求参数错误","error": err.Error(),})return }c.JSON(200, gin.H{"code": 200,"msg": "POST 请求成功","data": gin.H{"username": user.Username,"password": user.Password,},})
})
数据结构定义
package usertype User struct {Username string `json:"username"`Password string `json:"password"`
}
关键特性
- 数据绑定:
ShouldBindJSON()
自动将JSON数据绑定到结构体 - 错误处理:验证失败时返回详细的错误信息
- 响应格式:统一的JSON响应格式(code, msg, data)
模板渲染和静态文件
模板配置
engine.LoadHTMLGlob("templates/*")
静态文件服务
engine.Static("/static", "./static")
模板渲染
engine.GET("/index", func(c *gin.Context) {c.HTML(200, "index.html", gin.H{"title": "QX-hao的第一个 Gin 项目",})
})
路径映射关系
HTML引用路径 | 实际文件路径 |
---|
/static/css/style.css | ./static/css/style.css |
/static/js/main.js | ./static/js/main.js |
/static/images/logo.png | ./static/images/logo.png |
模板语法示例
<title>{{.title}}</title>
<link rel="stylesheet" href="/static/css/style.css">
<script src="/static/js/main.js"></script>
<img src="/static/images/logo.png" alt="Logo">
错误处理和日志记录
全局错误处理中间件
router.Use(func(c *gin.Context) {c.Next()if len(c.Errors) > 0 {c.JSON(http.StatusInternalServerError, gin.H{"error": "服务器内部错误"})}
})
错误模拟和记录
router.GET("/ping", func(c *gin.Context) {c.Error(gin.Error{Err: errors.New("处理过程中发生错误")})
})
错误处理流程
- 请求到达:浏览器发送请求
- 执行中间件:先执行自定义错误处理中间件
- 路由处理:执行具体的路由处理函数
- 错误检查:检查
c.Errors
中是否有错误 - 错误响应:如果有错误,返回统一的错误格式
日志配置
gin.SetMode(gin.ReleaseMode)
核心API总结
路由方法
方法 | 说明 | 示例 |
---|
GET | 处理GET请求 | r.GET("/path", handler) |
POST | 处理POST请求 | r.POST("/path", handler) |
PUT | 处理PUT请求 | r.PUT("/path", handler) |
DELETE | 处理DELETE请求 | r.DELETE("/path", handler) |
响应方法
方法 | 说明 | 示例 |
---|
c.JSON() | 返回JSON响应 | c.JSON(200, gin.H{"msg": "ok"}) |
c.HTML() | 返回HTML页面 | c.HTML(200, "index.html", data) |
c.String() | 返回文本响应 | c.String(200, "Hello") |
c.Redirect() | 重定向 | c.Redirect(302, "/new-path") |
数据绑定
方法 | 说明 | 示例 |
---|
ShouldBindJSON() | JSON数据绑定 | c.ShouldBindJSON(&user) |
ShouldBindQuery() | Query参数绑定 | c.ShouldBindQuery(¶ms) |
ShouldBindUri() | URI参数绑定 | c.ShouldBindUri(¶ms) |