02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)

数据解析绑定 json数据解析绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接受数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // JSON绑定 r.POST("loginJSON", func(c *gin.Context) { // 声明接收的变量 var json Login // 将request的body中的数据,自动按照json格式解析到结构体 if err := c.ShouldBindJSON(&json); err != nil { // 返回错误信息 // gin.H封装了生成json数据的工具 c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 if json.User != "root" || json.Pssword != "admin" { c.JSON(http.StatusBadRequest, gin.H{"status": "304"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run() } /* curl :8080/loginJSON -H 'content-type:application/json' -d "{\"user\":\"root\",\"password\":\"admin\"}" -X POST {"status":"200"}% */

表单数据解析和绑定

gin_demo1.go

package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接受数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // JSON绑定 r.POST("/loginFrom", func(c *gin.Context) { // 声明接受的变量 var form Login if err := c.Bind(&form); err != nil { c.JSON(http.StatusBadRequest,gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 if form.User != "root" || form.Pssword != "admin" { c.JSON(http.StatusBadRequest,gin.H{"status":"304"}) return } c.JSON(http.StatusOK,gin.H{"status":"200"}) }) r.Run() }

login.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://127.0.0.1:8080/loginFrom" method="post" enctype="multipart/form-data"> 用户名: <input type="text"> 密码: <input type="password"> <input type="submit" value="登录"> </form> </body> </html> URL数据解析和绑定

gin_demo1.go

package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接受数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // JSON绑定 r.GET("/:user/:password", func(c *gin.Context) { // 声明接受的变量 var login Login if err := c.ShouldBindUri(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if login.User != "root" || login.Pssword != "admin" { c.JSON(http.StatusBadRequest,gin.H{"status":"304"}) return } c.JSON(http.StatusOK,gin.H{"status":"200"}) }) r.Run() } /* curl :8080/root/admin {"status":"200"}% */ Gin渲染 各种数据格式的响应

json,结构体,xml, yaml类似于java的properties,protobuf

package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/testdata/protoexample" ) // 定义接受数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // 1. JSON绑定 r.GET("/someJSON", func(c *gin.Context) { c.JSON(200,gin.H{"message":"someJSON","status":200}) }) // 2. 结构体响应 r.GET("/someStruct", func(c *gin.Context) { var msg struct{ Name string Message string Number int } msg.Name = "root" msg.Message = "message" msg.Number = 123 c.JSON(200,msg) }) // 3. XML r.GET("/someXML", func(c *gin.Context) { c.XML(200,gin.H{"message":"abc"}) }) // 4. YAML r.GET("/someYAML", func(c *gin.Context) { c.YAML(200,gin.H{"name":"youmen"}) }) // 5.protobuf格式,谷歌开发的高效存储读取的工具 // 数组?切片?如果自己构建一个传输格式,应该是什么格式? r.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1),int64(2)} // 定义数据 label := "label" // 传protobuf格式数据 data := &protoexample.Test{ Label: &label, Reps: reps, } c.ProtoBuf(200,data) }) r.Run() } HTML模板渲染

gin支持加载HTML模板,然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换.

LoadHTMLGlob()方法可以加载配置文件

HTML渲染

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywzp.html