我將 Go 1.17 與 Gin 一起使用,我想在將資料發送到我的資料庫之前實作結構驗證。我以Gin 檔案中的示例為例。
在結構體中,我們可以宣告不同的標簽來驗證這樣的欄位:
type User struct {
FirstName string `json:"first_name" binding:"required"`
LastName string `json:"last_name" binding:"required"`
Age uint8 `json:"age" binding:"gte=0,lte=130"`
Email string `json:"email" binding:"required,email"`
FavouriteColor string `json:"favourite_color" binding:"iscolor"`
}
在處理程式中,我可以抓住這樣的錯誤:
var u User
if err := c.ShouldBindWith(&u, binding.Query); err == nil {
c.JSON(http.StatusOK, gin.H{"message": "Good Job"})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
錯誤訊息將是:
{
"error": "Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'User.LastName' Error:Field validation for 'LastName' failed on the 'required' tag\nKey: 'User.Email' Error:Field validation for 'Email' failed on the 'required' tag\nKey: 'User.FavouriteColor' Error:Field validation for 'FavouriteColor' failed on the 'iscolor' tag"
}
錯誤訊息太冗長了,如何向用戶回傳更好的錯誤?我想對 json 回應進行建模,例如:
{
"errors": [
"first_name": "This field is required",
"last_name": "This field is required",
"age": "This field is required",
"email": "Invalid email"
]
}
uj5u.com熱心網友回復:
Gin gonic 使用該包github.com/go-playground/validator/v10來執行系結驗證。如果驗證失敗,則回傳的錯誤為validator.ValidationErrors。
這沒有明確提到,但在模型系結和驗證中它指出:
Gin 使用 go-playground/validator/v10 進行驗證。在此處查看有關標簽使用的完整檔案。
鏈接到go-playground/validator/v10檔案,您可以在其中找到段落Validation Functions Return Type error。
您可以使用標準errors包來檢查錯誤是否是這樣,解開它并訪問單個欄位,即validator.FieldError. 從中,您可以構建您想要的任何錯誤訊息。
給定一個這樣的錯誤模型:
type ApiError struct {
Field string
Msg string
}
你可以這樣做:
var u User
err := c.BindQuery(&u);
if err != nil {
var ve validator.ValidationErrors
if errors.As(err, &ve) {
out := make([]ApiError, len(ve))
for i, fe := range ve {
out[i] = ApiError{fe.Field(), msgForTag(fe.Tag())}
}
c.JSON(http.StatusBadRequest, gin.H{"errors": out})
}
return
}
使用輔助函式為您的驗證規則輸出自定義錯誤訊息:
func msgForTag(tag string) string {
switch tag {
case "required":
return "This field is required"
case "email":
return "Invalid email"
}
return ""
}
在我的測驗中,這輸出:
{
"errors": [
{
"Field": "Number",
"Msg": "This field is required"
}
]
}
PS:要獲得帶有動態鍵的 json 輸出,您可以使用map[string]string而不是固定結構模型。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364100.html
下一篇:如何從goembed提供檔案
