例如,我正在嘗試確保發布請求的正文包含正文的確切結構,如果不包含則拋出錯誤
例如我有以下功能
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",
}
但目前這個端點接受沒有這種確切結構的身體。那么我如何強制請求正文中的結構,以便如果結構不匹配,我會拋出錯誤?
uj5u.com熱心網友回復:
不喜歡杜松子酒,纖維沒有內置驗證包
使用 go-playground/驗證器
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
}
或者您可以查看光纖辦公室檔案https://docs.gofiber.io/guide/validation#validator-package
uj5u.com熱心網友回復:
我們可以使用結構標簽
`validate:"required"`
確保所有必填欄位都在請求有效負載中。
此外,我們可以使用驗證器包提供的標簽驗證欄位,對于額外的驗證,我們可以實作自定義驗證器并像這樣注冊它們:
validate := validator.New()
validate.RegisterValidation("password-validator", PasswordValidator)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404492.html
標籤:
