go语言后端开发学习(三)——基于validator包实现接口校验

简介: go语言后端开发学习(三)——基于validator包实现接口校验

前言

在我们开发模块的时候,有一个问题是我们必须要去考虑的,它就是如何进行入参校验,在gin框架的博客中我就介绍过一些常见的参数校验,大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证,而这个其实也不是能够完全应对我们在日常开发中的需要,而今天我们要介绍的就是如何基于validator这个第三方库来实现对接口入参的校验,话不多说,开始发车!

validator包的下载

go get github.com/go-playground/validator/v10

validator的使用

背景介绍

在讲解validator包的使用方式之前我们先来看一个应用场景:博主最近在写自己的博客网站,而博客网站中有一个问题,我们先来看一下表结构:

type User struct {
  gorm.Model
  Username string `gorm:"type:varchar(20)" json:"username"`
  Password string `gorm:"type:varchar(100)" json:"password"`
  Role     int    `gorm:"type:int;default:2" json:"role"`
}

在博客中我设置了两种角色管理员(role=1)普通用户(role=2),而这也造成了一个问题:我们在添加用户按照正常业务情况是不能直接在前台创建管理员,而这个就需要我们在后端进行参数校验了(备注:其实参数校验这件事前后端都是要做的,但是我们这里介绍主要是后端,就以后端视角来介绍了),而接下来我们以给这个用户模块做参数校验为例,来介绍一下我们如何来实现参数校验以及一些其他的相关操作。

为数据模型添加校验条件

type User struct {
  gorm.Model
  Username string `gorm:"type:varchar(20)" json:"username" validate:"required,min=4,max=12"`
  Password string `gorm:"type:varchar(100)" json:"password" validate:"required,min=6 max=20"`
  Role     int    `gorm:"type:int;default:2" json:"role" validate:"required,gte=2"`
}

如上我们利用validate字段指明了数据的验证规则

拓展bindingvalidate的区别:

"validate"通常用于描述数据的验证规则,用于确保输入的数据符合特定的格式、要求或约束。验证通常在
数据提交之前进行,以确保数据的完整性和准确性。
而"binding"通常用于描述数据的绑定规则,用于将用户界面元素与数据模型进行关联。数据绑定确保用户输
入的数据与数据模型的字段正确地同步,使用户界面的更改能够反映在数据模型中,或反之亦然。因此,
"validate"主要关注数据的验证和校验,而"binding"主要关注数据在用户界面元素和数据模型之间的绑定
和同步

编写数据校验模块

我先示范一下数据消炎模块的书写,然后我再给大家具体讲解一下代码,首先我们来看一下最终我们所定义的User数据模型:

type User struct {
  gorm.Model
  Username string `gorm:"type:varchar(20)" json:"username" validate:"required,min=4,max=12" label:"用户名"`
  Password string `gorm:"type:varchar(100)" json:"password" validate:"required,min=6,max=20" label:"密码"`
  Role     int    `gorm:"type:int;default:2" json:"role" validate:"required,gte=2" label:"角色码"`
}

这里主要添加了两个标签:

  • validate:用来记录我们做入参验证的时候所做的限制条件
  • label:作为标记来返回标签值作为字段的名称

我们再来看校验模块的源代码:

package validator
import (
  "fmt"
  "gin_vue_blog/utils/errmsg"
  "github.com/go-playground/locales/zh_Hans_CN"
  ut "github.com/go-playground/universal-translator"
  "github.com/go-playground/validator/v10"
  "github.com/go-playground/validator/v10/translations/zh"
  "reflect"
)
func Validator(data any) (string, int) {
  validate := validator.New()
  uni := ut.New(zh_Hans_CN.New())
  trans, _ := uni.GetTranslator("zh_Hans_CN")
  err := zh.RegisterDefaultTranslations(validate, trans) // 注册翻译器
  if err != nil {
    fmt.Println("err:", err)
  }
  validate.RegisterTagNameFunc(func(field reflect.StructField) string {
    label := field.Tag.Get("label") // 获取label标签
    return label
  })
  err = validate.Struct(data)
  if err != nil {
    for _, err := range err.(validator.ValidationErrors) {
      return err.Translate(trans), errmsg.ERROR
    }
  }
  return "", errmsg.SUCCESS
}

我们可以来测试一下这段代码,效果如下:

我们可以看到我们成功实现了数据的校验功能,我们来看一下这一整个过程:

  1. 初始化valitor
validate := validator.New()
  1. 编写中间件,实现国际化
    validator中其默认的错误信息是英文,一定程度上会影响我们阅读,我们可以尝试将其转换为其他语言,这里我选择转换为简体中文:
uni := ut.New(zh_Hans_CN.New())
  trans, _ := uni.GetTranslator("zh_Hans_CN")
  err := zh.RegisterDefaultTranslations(validate, trans) // 注册翻译器
  if err != nil {
    fmt.Println("err:", err)
  }
  1. 进行数据校验并返回错误消息
err = validate.Struct(data)
if err != nil {
  for _, err := range err.(validator.ValidationErrors) {
    return err.Translate(trans), errmsg.ERROR
  }
}
return "", errmsg.SUCCESS
}

就这样我们就实现了一个通用的数据校验模块了。

相关文章
|
1月前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
46 7
|
2月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
43 3
|
2月前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
29 4
|
2月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
39 3
|
2月前
|
自然语言处理 Go 数据安全/隐私保护
如何在Go语言中实现表单验证?整一个validator吧!
本文通过一个实际示例,展示了如何使用 Go 语言的 Gin 框架结合 `validator` 包实现高级表单验证,并支持多语言错误提示。示例包括表单数据结构定义、自定义验证器、多语言支持及错误处理等关键步骤,确保用户提交的信息符合要求,并能根据用户语言偏好提供相应的错误提示。
50 0
|
3月前
|
算法 安全 API
绕过后端校验的策略
绕过后端校验的策略
39 0
|
4月前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
25天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
51 4
|
4天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。