get和post混合取参数
ginServer.POST("/post", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "0")
name := c.PostForm("name")
message := c.PostForm("message")
fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
})
bind绑定参数
1.json绑定
type PostParams struct {
Name string `json:"name"`
Age int `json:"age"`
Sex bool `json:"sex"`
}
func main() {
ginServer := gin.Default()
ginServer.POST("/testBind", func(c *gin.Context) {
var p PostParams
error := c.ShouldBindJSON(&p)
if error != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
} else {
c.JSON(http.StatusOK, gin.H{"data": p})
}
})
ginServer.Run(":8080")
}
2.uri
type PostParams struct {
Name string `json:"name" uri:"name"`
Age int `json:"age" uri:"age"`
Sex bool `json:"sex" uri:"sex"`
}
func main() {
ginServer := gin.Default()
ginServer.POST("/testBind/:name/:age/:sex", func(c *gin.Context) {
var p PostParams
error := c.ShouldBindUri(&p)
if error != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
} else {
c.JSON(http.StatusOK, gin.H{"data": p})
}
})
ginServer.Run(":8080")
}
3.query
type PostParams struct {
Name string `json:"name" uri:"name" form:"name"`
Age int `json:"age" uri:"age" form:"age"`
Sex bool `json:"sex" uri:"sex" form:"sex"`
}
func main() {
ginServer := gin.Default()
ginServer.POST("/testBind", func(c *gin.Context) {
var p PostParams
error := c.ShouldBindQuery(&p)
if error != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": error.Error()})
} else {
c.JSON(http.StatusOK, gin.H{"data": p})
}
})
ginServer.Run(":8080")
}
注意:如果一个字段用binding:"required"修饰,并且在绑定时该字段的值为空,那么将返回一个错误。
例如:
Name string `json:"name" uri:"name" form:"name" binding:"required"`
自定义验证器
package main
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// Booking 结构体定义
type Booking struct {
CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`
CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"`
}
// bookableDate 验证器函数,验证日期是否可预订
func bookableDate(fl validator.FieldLevel) bool {
date, ok := fl.Field().Interface().(time.Time)
if !ok {
return false
}
// 这里可以添加你的日期可预订的逻辑,例如检查日期是否在某个范围内或者其他条件
// 这里简单地演示了日期必须在当前日期之后才算可预订
return date.After(time.Now())
}
func main() {
// 创建一个默认的 Gin 引擎
router := gin.Default()
// 注册自定义验证器到 Gin 的验证器中
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
_ = v.RegisterValidation("bookabledate", bookableDate)
}
// 处理 POST 请求提交的表单数据
router.POST("/book", func(c *gin.Context) {
var booking Booking
// 使用 ShouldBind 根据绑定规则验证并解析表单数据
if err := c.ShouldBind(&booking); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "Booking successful",
"booking": booking,
})
})
// 启动服务器
router.Run(":8080")
}
标签:02,name,学习,json,func,error,go,gin,ginServer
From: https://www.cnblogs.com/nltack/p/18168301