go学习02

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")
}
posted @ 2024-04-30 16:38  wushucan  阅读(14)  评论(0)    收藏  举报