我如何验证 golang 中 rest api 请求的主体结构
how do i validate the body structure of rest api request in golang
我正在尝试确保 post 请求的正文包含正文的确切结构,如果没有则应该抛出错误
例如我有以下功能
func UpdatePassword(c *fiber.Ctx) error {
type UpdatePasswordData struct {
Password string `json:"password" form:"password"`
NewPassword string `json:"new_password" form:"new_password"`
NewPasswordConfirm string `json:"new_password_confirm" form:"new_password_confirm"`
}
data := UpdatePasswordData{}
if err := c.BodyParser(&data); err != nil {
return err
}
var user models.User
if data.NewPassword != data.NewPasswordConfirm {
c.Status(400)
return c.JSON(fiber.Map{
"message": "passwords do not match",
})
}
email, _ := middlewares.GetUserEmail(c)
newPassword := models.HashPassword(data.NewPassword)
database.DB.Model(&user).Select("Password").Where("email = ?", email).Updates(map[string]interface{}{"Password": newPassword})
return c.JSON(user)
}
POST 请求应该寻找具有这种结构的正文
{
"password": "oldpassword",
"new_password": "newpassword",
"new_password_confirm": "newpassword",
}
但目前此端点接受不具有此确切结构的正文。那么我如何在请求正文中强制执行结构,以便在结构不匹配时抛出错误?
我们可以使用结构标签
`validate:"required"`
确保请求负载中包含所有必填字段。
此外,我们可以使用验证器包提供的标签来验证字段,对于额外的验证,我们可以实现自定义验证器并像这样注册它们:
validate := validator.New()
validate.RegisterValidation("password-validator", PasswordValidator)
不喜欢gin,fiber没有内置验证包
使用go-playground/validator
go get github.com/go-playground/validator
例子
type UpdatePasswordData struct {
Password string `json:"password" validate:"required,min=8,max=32"`
NewPassword string `json:"new_password" validate:"required,min=8,max=32"`
NewPasswordConfirm string `json:"new_password_confirm" validate:"eqfield=NewPassword"`
}
func UpdatePassword(c *fiber.Ctx) error {
var body UpdatePasswordData
if err := c.BodyParser(&body); err != nil {
return err
}
validate := validator.New()
if err := validate.Struct(body); err != nil {
return err
}
// do others
// get current user, check password == hash(body.password)
// save new passworld
}
或者您可以查看 fiber office 文档 https://docs.gofiber.io/guide/validation#validator-package
我正在尝试确保 post 请求的正文包含正文的确切结构,如果没有则应该抛出错误
例如我有以下功能
func UpdatePassword(c *fiber.Ctx) error {
type UpdatePasswordData struct {
Password string `json:"password" form:"password"`
NewPassword string `json:"new_password" form:"new_password"`
NewPasswordConfirm string `json:"new_password_confirm" form:"new_password_confirm"`
}
data := UpdatePasswordData{}
if err := c.BodyParser(&data); err != nil {
return err
}
var user models.User
if data.NewPassword != data.NewPasswordConfirm {
c.Status(400)
return c.JSON(fiber.Map{
"message": "passwords do not match",
})
}
email, _ := middlewares.GetUserEmail(c)
newPassword := models.HashPassword(data.NewPassword)
database.DB.Model(&user).Select("Password").Where("email = ?", email).Updates(map[string]interface{}{"Password": newPassword})
return c.JSON(user)
}
POST 请求应该寻找具有这种结构的正文
{
"password": "oldpassword",
"new_password": "newpassword",
"new_password_confirm": "newpassword",
}
但目前此端点接受不具有此确切结构的正文。那么我如何在请求正文中强制执行结构,以便在结构不匹配时抛出错误?
我们可以使用结构标签
`validate:"required"`
确保请求负载中包含所有必填字段。
此外,我们可以使用验证器包提供的标签来验证字段,对于额外的验证,我们可以实现自定义验证器并像这样注册它们:
validate := validator.New()
validate.RegisterValidation("password-validator", PasswordValidator)
不喜欢gin,fiber没有内置验证包
使用go-playground/validator
go get github.com/go-playground/validator
例子
type UpdatePasswordData struct {
Password string `json:"password" validate:"required,min=8,max=32"`
NewPassword string `json:"new_password" validate:"required,min=8,max=32"`
NewPasswordConfirm string `json:"new_password_confirm" validate:"eqfield=NewPassword"`
}
func UpdatePassword(c *fiber.Ctx) error {
var body UpdatePasswordData
if err := c.BodyParser(&body); err != nil {
return err
}
validate := validator.New()
if err := validate.Struct(body); err != nil {
return err
}
// do others
// get current user, check password == hash(body.password)
// save new passworld
}
或者您可以查看 fiber office 文档 https://docs.gofiber.io/guide/validation#validator-package