2 回答

TA貢獻(xiàn)1847條經(jīng)驗 獲得超11個贊
我不知道是否有必要使用中間件,但我最近嘗試做一些事情,我發(fā)現(xiàn)了一個很棒的教程,您可以在此處查看。
使用 Gin 您可以使用綁定:
例子:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type AnyStruct struct {
Price uint `json:"price" binding:"required,gte=10,lte=1000"`
}
func main() {
engine:=gin.New()
engine.POST("/test", func(context *gin.Context) {
body:=AnyStruct{}
if err:=context.ShouldBindJSON(&body);err!=nil{
context.AbortWithStatusJSON(http.StatusBadRequest,
gin.H{
"error": "VALIDATEERR-1",
"message": "Invalid inputs. Please check your inputs"})
return
}
context.JSON(http.StatusAccepted,&body)
})
engine.Run(":3000")
}

TA貢獻(xiàn)1921條經(jīng)驗 獲得超9個贊
不要使用逗號分隔結(jié)構(gòu)標(biāo)簽鍵值對,使用空格。
您可以使用泛型(類型參數(shù))來替換<something>,但您的控制器需要將具體類型作為它們的參數(shù)。
例如:
func ReqValidate[T any](next func(*gin.Context, *T)) gin.HandlerFunc {
return func(c *gin.Context) {
params := new(T)
if err := c.ShouldBindJSON(params); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
next(c, params)
}
}
然后是控制器:
type LoginRequestBody struct {
Username string `json:"username" validate:"required"`
Password string `json:"password" validate:"required"`
}
func LoginController(c *gin.Context, params *LoginRequestBody) {
// ...
}
type SignupReqBody struct {
Username string `json:"username" validate:"required"`
Password string `json:"password" validate:"required"`
Age int `json:"age" validate:"required"`
}
func SignupController(c *gin.Context, params *SignupReqBody) {
// ...
}
然后是路由:
router := gin.Default()
router.POST("/login", ReqValidate(LoginController))
router.POST("/signup", ReqValidate(SignupController))
- 2 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報