3.gin数据解析和 绑定
3.1 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"` Password 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 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.Password != "admin" { c.JSON(http.StatusBadRequest, gin.H{"status":"304"}) return } c.JSON(http.StatusOK, gin.H{"status":200}) }) r.Run(":8000") }
-
发送请求:
xujunkai@adeMacBook-Pro ~ % curl http://127.0.0.1:8000/loginJSON -H 'content-type:application/json' -d {"user":"root","password":"admin"} -X POST // 返回错误,因为发送数据没有进行json转换字符串: {"error":"invalid character 'u' looking for beginning of value"} // 当发送数据类型json str 就可以了 xujunkai@adeMacBook-Pro ~ % curl http://127.0.0.1:8000/loginJSON -H 'content-type:application/json' -d "{"user":"root","password":"admin"}" -X POST {"status":200}%
3.2表单数据解析和绑定
-
html片段
<body> <form action="http://localhost:8000/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>
-
后端代码
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"` Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { // 1.创建路由 // 默认使用了2个中间件Logger() ,Recovery() r := gin.Default() // JSON绑定 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.User != "root" || form.Password != "admin" { c.JSON(http.StatusBadRequest, gin.H{"status":"304"}) return } c.JSON(http.StatusOK, gin.H{"status":200}) }) r.Run(":8000") }
效果展示:
![43099DE2-AAA8-4E0A-952E-C465C6C50C68](/Users/xujunkai/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/874524334/QQ/Temp.db/43099DE2-AAA8-4E0A-952E-C465C6C50C68.png)
3.3URL数据解析和绑定
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"`
Password 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
// 解析URL上面参数
if err := c.ShouldBindUri(&login); err!=nil {
// 返回错误信息
// gin.H 封装了生成json数据的工具
c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()})
return
}
// 判断用户名和密码是否正确
if login.User != "root" || login.Password != "admin" {
c.JSON(http.StatusBadRequest, gin.H{"status":"304"})
return
}
c.JSON(http.StatusOK, gin.H{"status":200})
})
r.Run(":8000")
}
- 访问URL:
http://127.0.0.1:8000/root/admin