一. Json数据解析和绑定
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="/loginForm" method="post"enctype="application/x-www-form-urlencoded">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
代码:
- gin.Context中的ShouldBind方法将请求中的正文中的数据,自动按照json格式解析到结构体。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收数据的结构体
type Login struct {
//binding:"required"修饰字段,若接收为空值,则报错
Account string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
Passwd string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func main() {
//创建路由
r := gin.Default()
//设置HTML文件所在目录
r.LoadHTMLGlob("./*.html")
r.GET("/", func(c *gin.Context) {
//发送html文件内容
c.HTML(http.StatusOK, "index.html", nil)
})
r.POST("/loginForm", 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.Account != "root" || json.Passwd != "admin" {
c.JSON(http.StatusBadRequest, gin.H{
"status": ".304",
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
})
r.Run()
}
演示:
二. 表单数据解析和绑定
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="/loginForm" method="post"enctype="application/x-www-form-urlencoded">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
代码:
- gin.Context的Bind方法默认解析并绑定form格式,根据请求头中的content-type自动推断。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收数据的结构体
type Login struct {
//binding:"required"修饰字段,若接收为空值,则报错
Account string `form:"username" binding:"required"`
Passwd string `form:"password" binding:"required"`
}
func main() {
//创建路由
r := gin.Default()
//设置HTML文件所在目录
r.LoadHTMLGlob("./*.html")
r.GET("/", func(c *gin.Context) {
//发送html文件内容
c.HTML(http.StatusOK, "index.html", nil)
})
r.POST("/loginForm", func(c *gin.Context) {
//声明接收变量
var form Login
//Bind()默认解析并绑定form格式
//根据请求头中的content-type自动推断
if err := c.Bind(&form); err != nil {
//gin.H封装了生成json数据工具
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
//判断用户名密码是否正确
if form.Account != "root" || form.Passwd != "admin" {
c.JSON(http.StatusBadRequest, gin.H{
"status": ".304",
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
})
r.Run()
}
三. URI数据解析和绑定
- gin.Context中的ShouldBindUri方法将uri中的数据,自动按照uri格式解析到结构体。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收数据的结构体
type Login struct {
//binding:"required"修饰字段,若接收为空值,则报错
Account string `uri:"user" binding:"required"`
Passwd string `uri:"password" binding:"required"`
}
func main() {
//创建路由
r := gin.Default()
r.GET("/:user/:password", func(c *gin.Context) {
//声明接收变量
var uri Login
if err := c.ShouldBindUri(&uri); err != nil {
//gin.H封装了生成json数据工具
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
//判断用户名密码是否正确
if uri.Account != "root" || uri.Passwd != "admin" {
c.JSON(http.StatusBadRequest, gin.H{
"status": ".304",
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
})
r.Run()
}
演示: