在Golang中请求正文验证

时间:2019-10-29 05:41:49

标签: json validation go request http-post

我正在使用gin来处理请求,但是在验证请求正文中的数据时遇到了麻烦,例如

type User struct {
    Username  string  `json:"username" binding:"required,min=1,max=16"`
    Name  string  `json:"name" binding:"required,min=1,max=16"`
    Password string `json:"password" binding:"required,min=1,max=16"`
}

func loginHandler(ctx *gin.Context) {
    var user User
    if err := ctx.ShouldBindJSON(&user); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
}

如何处理带有" username "" John Doe "这样的空格的值?据我所知,在gin的验证器中不可能使用正则表达式。 Golang中用于请求正文验证的最佳做法或模式是什么?

1 个答案:

答案 0 :(得分:1)

Reg验证程序包:https://godoc.org/gopkg.in/validator.v2

// main.go
package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
    "gopkg.in/validator.v2"
)

type User struct {
    Username string `json:"username" validate:"min=1,max=16,regexp=^[a-zA-Z]*$"`
    Name     string `json:"name" validate:"min=1,max=16"`
    Password string `json:"password" validate:"min=1,max=16"`
}

func loginHandler(ctx *gin.Context) {
    var user User
    if err := ctx.ShouldBindJSON(&user); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
    }

    if err := validator.Validate(user); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
    }
}

func main() {
    r := gin.Default()
    r.POST("/login", loginHandler)
    r.Run()
}

请求:POST:localhost:8080 / login

{
    "username":"123123",
    "name":"golang",
    "password":"gin"
}

响应:

{
    "error": "Username: regular expression mismatch "
}