簡體   English   中英

Gin Golang 中的驗證號

[英]Validation Number in Gin Golang

驗證 gin 中的數字時出現錯誤,對於字符串數據類型沒有錯誤並且檢測到它們,但是當我用字符串填寫 int 類型的價格字段時,它會出現 500 的錯誤,我希望錯誤為400,解決辦法是什么?

package web
type BookRequest struct{
    Title string `json:"title" binding:"required"`
    Description string `json:"description" binding:"required"`
    Price int `json:"price" binding:"required,numeric,gte=0"`
    Rating int `json:"rating" binding:"required,numeric"`
}
func (controller *BookControllerImpl) Create(ctx *gin.Context) {
    var bookRequest web.BookRequest

    err := ctx.ShouldBindJSON(&bookRequest)
    if err != nil {

        var error_request []string
        for _, e := range err.(validator.ValidationErrors) {
            errorMessage := fmt.Sprintf("Error field %s, Condition %s", e.Field(), e.ActualTag())
            error_request = append(error_request, errorMessage)
        }

        ctx.JSON(http.StatusBadRequest, web.WebResponse{
            Code:   http.StatusBadRequest,
            Status: "BAD REQUEST",
            Data:   error_request,
        })

        return
    }

    book, err := controller.BookService.Create(bookRequest)
    if err != nil {
        ctx.JSON(http.StatusBadRequest, web.WebResponse{
            Code:   http.StatusBadRequest,
            Status: "BAD REQUEST",
            Data:   err,
        })
    }

    ctx.JSON(http.StatusOK, web.WebResponse{
        Code:   200,
        Status: "Ok",
        Data:   book,
    })
}
  1. when I fill in the price field of type int with a string

如果您的請求( payload Price )不是標准的,或者它可以是string or number ,您可以為您的結構使用json.Number類型。

type BookRequest struct{
    Title string `json:"title" binding:"required"`
    Description string `json:"description" binding:"required"`
    Price json.Number `json:"price" binding:"required,numeric,gte=0"`
    Rating int `json:"rating" binding:"required,numeric"`
}

這是 json 的一個簡單示例。編號: https://go.dev/play/p/7fyCFAon2PC

  1. 您必須檢查err 是否是這樣的validator.ValidationErrors
...
err := ctx.ShouldBindJSON(&bookRequest)
if err != nil {
    if vals, ok := err.(validator.ValidationErrors); ok {
        // do for loop from vals
        ...
        ctx.JSON(http.StatusBadRequest, web.WebResponse{
            Code:   http.StatusBadRequest,
            Status: "BAD REQUEST",
            Data:   error_request,
        })
        return
    }
    ctx.JSON(http.StatusInternalServerError, web.WebResponse{
        Code:   http.StatusInternalServerError,
        Status: "Internal Server Error",
        Data:   err,
    })
    return
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM