我正在try 创建一个通用的HTTP请求验证器中间件函数,该函数接受类型(可能是refect.Type)作为参数,然后使用包github.com/go-playground/validator/v10能够将JSON解组为所述类型的 struct 并验证该 struct .我试着用下面的示例代码来解释...

示例

type LoginRequestBody struct {
   Username string `json:"username",validate:"required"`
   Password string `json:"password",validate:"required"`
}

type SignupReqBody struct {
   Username string `json:"username",validate:"required"`
   Password string `json:"password",validate:"required"`
   Age      int    `json:"age",validate:"required"`
}

// sample routers with a common middleware validator function
router.POST("/login", ReqValidate("LoginRequestBody"), LoginController)
router.POST("/signup", ReqValidate("SignupReqBody"), SignupController)

func ReqValidate(<something>) gin.HandlerFunc {
   return func (c *gin.Context) {
      // unmarshalling JSON into a struct
      // common validation logic...
      c.Next()
   }
}

总体而言,我希望使用Joi包实现与Node.js中相同的验证器灵活性.

推荐答案

我不知道是否有必要使用中间件,但我最近正在try 做一些事情,我发现了一个很好的教程,你可以看到here个.

使用Gin,您可以使用绑定:

Example:

package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
type AnyStruct struct {
   Price uint `json:"price" binding:"required,gte=10,lte=1000"`
}
func main() {
  engine:=gin.New()
  engine.POST("/test", func(context *gin.Context) {
     body:=AnyStruct{}
     if err:=context.ShouldBindJSON(&body);err!=nil{
        context.AbortWithStatusJSON(http.StatusBadRequest,
        gin.H{
            "error": "VALIDATEERR-1",
            "message": "Invalid inputs. Please check your inputs"})
        return
     }
     context.JSON(http.StatusAccepted,&body)
  })
  engine.Run(":3000")
}

Go相关问答推荐

GetSecretValue,get identity:get credentials:无法刷新缓存的凭据

一种基于时间的Golang函数节制器

由于索引器压缩比限制,扫描包含golang包的图像时,伪影XRAY失败

在Uber FX中实现后台进程正常关闭的正确方式是什么?

如何给杜松子wine 的路由加上一个名字,比如Laravel ?

戈姆:如何将一对一联系起来?

JWT 如何解析声明有效性和错误?

Cypher 查找(多个)最低 node

在 GoLang 中对自定义 struct 体数组进行排序

无法在go中为docker容器写入有效的挂载路径

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

如何使用 go-playground/validator 编写 snake case 绑定标签?

速率限制特定端点

go:识别重新定义标志的包

切片到数组指针的转换

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

使用反射在 struct 内迭代切片 struct

Golang - 无法从 pipped Windows 命令中获取结果

为什么 template.ParseFiles() 没有检测到这个错误?