参数校验使用步骤全攻略

举报
码乐 发表于 2024/11/25 10:00:42 2024/11/25
【摘要】 1 简介输入验证对于任何软件应用程序中的数据完整性和安全性都至关重要。Go 是一种功能强大且流行的编程语言,以其简单性和性能而闻名,它提供“validator”包 (v10) 以实现高效验证。合理使用验证器可以增强应用程序健壮性。 2 工具和库ValidatorValidator.v10这可以帮助更简便快捷地实现参数校验和安全传递变量。框架gin内置了 github.com/go-play...

1 简介

输入验证对于任何软件应用程序中的数据完整性和安全性都至关重要。
Go 是一种功能强大且流行的编程语言,以其简单性和性能而闻名,它提供“validator”包 (v10) 以实现高效验证。合理使用验证器可以增强应用程序健壮性。

2 工具和库Validator

Validator.v10这可以帮助更简便快捷地实现参数校验和安全传递变量。

框架gin内置了 github.com/go-playground/validator/v10,用于字段验证。
可以自定义校验规则,满足复杂需求。我们可以灵活地创建针对您的特定应用程序要求定制的自定义验证器。
自定义验证器允许您对数据执行特定于域的规则,从而确保更精确的输入验证。

以下是创建名为 PercentageValidator 的自定义验证程序的示例

3 示例:标签校验

	import (
		"github.com/go-playground/validator/v10"
		"github.com/gin-gonic/gin"
	)

	type User struct {
		Email string `json:"email" binding:"required,email"`
		Age   int    `json:"age" binding:"gte=0,lte=120"` // 年龄范围 0-120
	}

	var validate *validator.Validate

	func main() {
		validate = validator.New()

		r := gin.Default()
		r.POST("/validate", func(c *gin.Context) {
			var user User
			if err := c.ShouldBindJSON(&user); err != nil {
				c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
				return
			}

			c.JSON(http.StatusOK, gin.H{"message": "Validation passed!"})
		})
		r.Run()
	}

将验证接收 JSON 格式数据的简单 API 终端节点的输入参数。
在此示例中,该函数检查输入值是否表示有效百分比(范围从 0 到 120)。
Validator验证器支持各种数据类型,包括 strings、integers 和 floats

4 更复杂的校验

以下为使用步骤

  • 1 使用自定义验证器

您需要在执行输入验证之前将其注册到 Validator V10。

您可以在合适的位置通过以下方式注册它:

	validate := validator.New()

	// Registering the custom validator
	validate.RegisterValidation("rangeAge",  ageValidator)
  • 2 使用校验函数

检测输入的数字是否在100以内

	func ageValidator(fl validator.FieldLevel) bool {
		maxPercent := decimal.NewFromInt(1)
		minPercent := decimal.NewFromInt(0)

		quantity := decimal.NewFromInt(100)

		switch v := fl.Field(); v.Kind() {
		case reflect.String:
			val, err := decimal.NewFromString(v.String())
			logs.Println("val before /100 :", val)
			val = val.Div(quantity) // / 100.0
			logs.Println("val after /100 :", val)

			if err == nil && val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
				return true
			}
		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
			val := decimal.NewFromInt(v.Int())
			logs.Println("val before /100 :", val)
			val = val.Div(quantity)
			logs.Println("val after /100 :", val)
			if val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
				return true
			}
		case reflect.Float32, reflect.Float64:
			val := decimal.NewFromFloat(v.Float())
			logs.Println("val before /100 :", val)
			val = val.Div(quantity)
			logs.Println("val after /100 :", val)
			if val.Abs().GreaterThanOrEqual(minPercent) && val.Abs().LessThanOrEqual(maxPercent) {
				return true
			}
		default:
			return false
		}

		return false
	}
  • 3 绑定到定义数据结构:

接下来,我们定义一个 Go 结构体,它表示我们期望接收的输入的数据结构:

type User struct {
    Username  string `json:"username" validate:"required,min=5,max=20"`
    Email     string `json:"email" validate:"required,email"`
    Age       int    `json:"age" validate:"ageValidator"`
}

在此示例中,我们有一个 User 结构,其中包含三个字段 Username、 Email、 和Age 。我们使用 Go Validator V10 语法添加了验证标签,以指定每个字段的验证规则。

现在,你可以将 validation 标签应用于 User 结构或任何其他数据结构中需要年龄验证的任何字段: age

通过创建自定义验证器,您可以根据特定应用程序的需求定制输入验证,从而确保数据处理的准确性和安全性。
它简化了以下任务:

添加特定于应用程序需求的自定义验证规则。
轻松转换错误消息以提供用户友好的反馈。
只需几行代码即可快速注册自定义验证器。
  • 4 输入验证

验证输入:validator提供了内置验证标签外
现在,让我们实现 API 端点并验证传入的数据:

		// 注册新用户
		func createUserHandler(ctx *gin.Context) {
			// createUserHandler(w http.ResponseWriter, r *http.Request) {
			var user User
			//r := ctx.Request
			//w := ctx.Writer
			// Parse the JSON request and populate the User struct
			err := ctx.ShouldBindJSON(&user)
			logs.Printf("receive user:%#v \n", user)
			if err != nil {
				// http.Error(w, "Invalid JSON", http.StatusBadRequest)
				ctx.JSON(http.StatusBadRequest, "Invalid JSON")
				return
			}

			// Create a new validator instance and RegisterValidation
			validate := validator.New()
			validate.RegisterValidation("ageValidator", ageValidator)

			// Validate the User struct
			err = validate.Struct(user)
			if err != nil {
				// Validation failed, handle the error
				errors := err.(validator.ValidationErrors)
				// http.Error(w, fmt.Sprintf("Validation error: %s", errors), http.StatusBadRequest)
				ctx.JSON(http.StatusBadRequest, fmt.Sprintf("Validation error: %s", errors))

				return
			}

			// Validation passed, proceed to process the user data
			// Your application logic goes here...

			// Send a success response
			// w.WriteHeader(http.StatusOK)
			// fmt.Fprintf(w, "User created successfully!")
			ctx.JSON(http.StatusOK, gin.H{"data": fmt.Sprintf("Validation success: %v", user), "code": 10000})

		}

在此代码片段中,我们首先解析传入的 JSON 数据并填充 User 结构。
然后,我们创建一个新的验证程序实例,并使用 validate.Struct(user).
如果验证失败,将返回包含特定验证错误的错误消息。否则,我们的应用程序逻辑可以继续处理经过验证的数据。

5 校验和测试

绑定注册函数到路由

	func WebValidationService(addr string) error {

		oe := gin.Default()
		busses := oe.Group("/user")
		busses.POST("/new", createUserHandler) //

		if addr == "" {
			addr = "0.0.0.0:2131"
		}
		fmt.Printf("board Web service:%v\n", addr)
		return oe.Run(addr)
	}

启动服务后调用校验测试

		curl --location --request POST "http://127.0.0.1:881/user/new" ^
		--header "User-Agent: Apifox/1.0.0 (https://www.apifox.cn)" ^
		--header "Content-Type: application/json" ^
		--header "Accept: */*" ^
		--header "Host: 127.0.0.1:881" ^
		--header "Connection: keep-alive" ^
		--data-raw "{    \"email\":\"2312@da.com\",    \"age\":122}"

返回错误

"Validation error: Key: 'User.Age' Error:Field validation for 'Age' failed on the 'ageValidator' tag"
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。