gin 可用 shouldbindjson() 绑定请求体,用 shouldbindquery() 绑定 url 查询参数。为两种输入各定义一个结构体,出错时分别返回 400。

准备本地 Gin 项目
在练习目录安装 Gin。
go mod init preview-demo go get github.com/gin-gonic/gin

依赖版本由 go.mod 记录,执行时需满足该版本的 Go 要求。
分别校验请求体和查询参数
保存为 main.go。示例只返回预览内容。
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
type Payload struct {
Name string `json:"name" binding:"required,max=80"`
}
type Query struct {
Limit int `form:"limit" binding:"required,min=1,max=10"`
}
func main() {
router := gin.Default()
router.POST("/preview", func(c *gin.Context) {
var query Query
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid limit"})
return
}
var body Payload
if err := c.ShouldBindJSON(&body); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid body"})
return
}
c.JSON(http.StatusOK, gin.H{"name": body.Name, "limit": query.Limit})
})
log.Fatal(router.Run("127.0.0.1:8080"))
}form 标签映射查询参数,json 标签映射请求体字段。
用有效和无效参数验证状态码
先运行 go run .,再另开终端执行。
curl -i -H 'Content-Type: application/json' -d '{"name":"demo"}' \
'http://127.0.0.1:8080/preview?limit=3'
curl -i -H 'Content-Type: application/json' -d '{"name":"demo"}' \
'http://127.0.0.1:8080/preview?limit=0'第一条返回 200 和已绑定的数据,第二条返回 400。


















