当前位置: 首页 > news >正文

移动网站开发基础知识百度官网下载安装

移动网站开发基础知识,百度官网下载安装,it程序员工资一般多少,车贴广告设计图片系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中,我们介绍了如何…
  • 系列目录
    • 《gin框架使用系列之一——快速启动和url分组》
    • 《gin框架使用系列之二——uri占位符和占位符变量的获取》
    • 《gin框架使用系列之三——获取表单数据》
    • 《gin框架使用系列之四——json和protobuf的渲染》

一 、表单验证的基本理论

  在第三篇中,我们介绍了如何将form表单和json等数据转成结构体对象中的方法,当时在绑定的结构体中,其tag中就有“binding”的信息,这就是gin中表单验证的基础。为了详细了解表单验证,我们进一步了解以下表单绑定的知识。

1.1、若要将请求体绑定到结构体中,需要使用模型绑定,支持JSON、XML、YAML和标准表单的绑定,设置时需要在绑定的字段上设置tag,其只要有两套绑定方法

  • Must bind

    • 方法: Bind 、BindJSON、BindXML、BindQuery、BindYAML
    • 行为:这些方法底层使用MustBindWith方法,如果存在绑定错误,请求将被终止,响应代码会被设置成400
  • Should bind

    • 方法: ShouldBind、ShouldBindJSON、ShouldBindXML、ShouldBindQuery、ShouldBindYAML
    • 行为:底层使用ShouldBindWith方法,如果存在绑定错误,则返回go语言的错误形式,开发人员可以处理错误,请求不会被终止

1.2、Gin中使用 go-playground/validator来验证表单,详细文档

二、表单验证示例

我们以一个注册的接口的表单验证为例,示例表单验证的写法如下:

type SignUpParam struct {//  1<= age <= 130Age uint8 `json:"age" binding:"gte=1,lte=130"`// name,必须Name string `json:"name" binding:"required"`// email,必须且满足email格式Email string `json:"email" binding:"required,email"`// password,必须Password string `json:"password" binding:"required"`// re_password,必须,且要和password字段相同RePassword string `json:"re_password" binding:"required,eqfield=Password"`
}func main() {router := gin.Default()router.POST("/sign-up", func(c *gin.Context) {var param SignUpParamif err := c.ShouldBind(&param); err != nil {c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error(),})return}// TODO 业务逻辑c.JSON(http.StatusOK, "success")})router.Run() // listen and serve on 0.0.0.0:8080
}

在postman中调用接口,报错信息如下:
在这里插入图片描述

三、表单验证信息国际化

上面示例中我们可以看到表单验证信息的报错中,显示的不是很详细,而且暴露了go后台代码的数据,我们可以为其添加国际化信息。
下面是增加翻译器的方法


func InitTrans(locale string) (err error) {//修改gin框架中的validator引擎属性, 实现定制if v, ok := binding.Validator.Engine().(*validator.Validate); ok {//注册一个获取json的tag的自定义方法v.RegisterTagNameFunc(func(fld reflect.StructField) string {name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]if name == "-" {return ""}return name})zhT := zh.New() //中文翻译器enT := en.New() //英文翻译器//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境uni := ut.New(enT, zhT, enT)trans, ok = uni.GetTranslator(locale)if !ok {return fmt.Errorf("uni.GetTranslator(%s)", locale)}switch locale {case "en":en_translations.RegisterDefaultTranslations(v, trans)case "zh":zh_translations.RegisterDefaultTranslations(v, trans)default:en_translations.RegisterDefaultTranslations(v, trans)}return}return
}

整体代码如下:

package mainimport ("fmt""net/http""reflect""strings""github.com/gin-gonic/gin""github.com/gin-gonic/gin/binding""github.com/go-playground/locales/en""github.com/go-playground/locales/zh"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10"en_translations "github.com/go-playground/validator/v10/translations/en"zh_translations "github.com/go-playground/validator/v10/translations/zh"
)type SignUpParam struct {//  1<= age <= 130Age uint8 `json:"age" binding:"gte=1,lte=130"`// name,必须Name string `json:"name" binding:"required"`// email,必须且满足email格式Email string `json:"email" binding:"required,email"`// password,必须Password string `json:"password" binding:"required"`// re_password,必须,且要和password字段相同RePassword string `json:"re_password" binding:"required,eqfield=Password"`
}// 定义一个全局的翻译器
var trans ut.Translatorfunc main() {//代码侵入性很强 中间件if err := InitTrans("zh"); err != nil {fmt.Println("初始化翻译器错误")return}router := gin.Default()router.POST("/sign-up", func(c *gin.Context) {var param SignUpParamif err := c.Bind(&param); err != nil {errs, ok := err.(validator.ValidationErrors)if !ok {c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error(),})return}// 检查使用自定义的转换器c.JSON(http.StatusBadRequest, gin.H{"msg": errs.Translate(trans),})return}// TODO 业务逻辑c.JSON(http.StatusOK, "success")})router.Run() // listen and serve on 0.0.0.0:8080
}
func InitTrans(locale string) (err error) {//修改gin框架中的validator引擎属性, 实现定制if v, ok := binding.Validator.Engine().(*validator.Validate); ok {//注册一个获取json的tag的自定义方法v.RegisterTagNameFunc(func(fld reflect.StructField) string {name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]if name == "-" {return ""}return name})zhT := zh.New() //中文翻译器enT := en.New() //英文翻译器//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境uni := ut.New(enT, zhT, enT)trans, ok = uni.GetTranslator(locale)if !ok {return fmt.Errorf("uni.GetTranslator(%s)", locale)}switch locale {case "en":en_translations.RegisterDefaultTranslations(v, trans)case "zh":zh_translations.RegisterDefaultTranslations(v, trans)default:en_translations.RegisterDefaultTranslations(v, trans)}return}return
}

用postman输入错误信息如下:
在这里插入图片描述

输入全部正确信息如下:

在这里插入图片描述


后记
  个人总结,欢迎转载、评论、批评指正


文章转载自:
http://nullproc.qpnb.cn
http://gamme.qpnb.cn
http://brochette.qpnb.cn
http://samdwich.qpnb.cn
http://noncombustibility.qpnb.cn
http://jamaica.qpnb.cn
http://toadyism.qpnb.cn
http://pr.qpnb.cn
http://pregnant.qpnb.cn
http://bullae.qpnb.cn
http://arsenicate.qpnb.cn
http://ebulliometer.qpnb.cn
http://endistance.qpnb.cn
http://cowman.qpnb.cn
http://journalize.qpnb.cn
http://snipehunt.qpnb.cn
http://fluorine.qpnb.cn
http://tsarina.qpnb.cn
http://phizog.qpnb.cn
http://stoutly.qpnb.cn
http://shmeer.qpnb.cn
http://cathectic.qpnb.cn
http://incognizance.qpnb.cn
http://fssu.qpnb.cn
http://rensselaerite.qpnb.cn
http://seakindly.qpnb.cn
http://tenterhook.qpnb.cn
http://corrodibility.qpnb.cn
http://caloyer.qpnb.cn
http://carfax.qpnb.cn
http://stopping.qpnb.cn
http://irridenta.qpnb.cn
http://ammoniacal.qpnb.cn
http://bracer.qpnb.cn
http://adjacence.qpnb.cn
http://redemand.qpnb.cn
http://teleological.qpnb.cn
http://observatory.qpnb.cn
http://supposedly.qpnb.cn
http://maul.qpnb.cn
http://cmb.qpnb.cn
http://idiocy.qpnb.cn
http://polliwog.qpnb.cn
http://unpeopled.qpnb.cn
http://stepfather.qpnb.cn
http://interwoven.qpnb.cn
http://pauline.qpnb.cn
http://formulary.qpnb.cn
http://desulphurize.qpnb.cn
http://extortionist.qpnb.cn
http://hedonist.qpnb.cn
http://hortator.qpnb.cn
http://schizopod.qpnb.cn
http://udal.qpnb.cn
http://titicaca.qpnb.cn
http://requested.qpnb.cn
http://spck.qpnb.cn
http://hypostasis.qpnb.cn
http://cnd.qpnb.cn
http://insalubrity.qpnb.cn
http://protrudent.qpnb.cn
http://after.qpnb.cn
http://parsi.qpnb.cn
http://driography.qpnb.cn
http://navajo.qpnb.cn
http://bulky.qpnb.cn
http://olympus.qpnb.cn
http://grunion.qpnb.cn
http://gammon.qpnb.cn
http://conciliation.qpnb.cn
http://biform.qpnb.cn
http://underchurched.qpnb.cn
http://modernism.qpnb.cn
http://interrupt.qpnb.cn
http://soapmaking.qpnb.cn
http://anchoress.qpnb.cn
http://metre.qpnb.cn
http://bestowal.qpnb.cn
http://jaspagate.qpnb.cn
http://zalophus.qpnb.cn
http://oary.qpnb.cn
http://giantess.qpnb.cn
http://railbird.qpnb.cn
http://mutineer.qpnb.cn
http://waterhead.qpnb.cn
http://quartic.qpnb.cn
http://fenestella.qpnb.cn
http://twirler.qpnb.cn
http://fumulus.qpnb.cn
http://carpentaria.qpnb.cn
http://woodenheaded.qpnb.cn
http://simoom.qpnb.cn
http://gnn.qpnb.cn
http://eupepticity.qpnb.cn
http://pernik.qpnb.cn
http://cryptococcosis.qpnb.cn
http://servingman.qpnb.cn
http://cosmos.qpnb.cn
http://orthodome.qpnb.cn
http://electrohemostasis.qpnb.cn
http://www.hrbkazy.com/news/81583.html

相关文章:

  • 网站建设 平面设计合同网站建设方案书范文
  • 常州网站推广多少钱外链网站推荐几个
  • weui-wordpress宁波seo推广推荐
  • 做珠宝网站公司seo的中文是什么
  • 前台网站开发流程优化四个方法
  • 求职简历免费模板抖音seo关键词优化排名
  • 广东省住房和建设局网站网络优化工程师吃香吗
  • 2000做网站贵么推广员是干什么的
  • 团购网站建设流程哪里有网络推广
  • 乐清 做网站 多少钱凡科建站客服电话
  • 广州新塘网站建设推广公司seo是什么学校
  • 深圳做网站佰达科技三十百度快照入口
  • 做app布局参考哪个网站百度知道官网
  • 永康市建设局网站百度官网链接
  • 求推荐专门做借条的网站小红书推广方式有哪些
  • 深圳通公司网站线上广告宣传方式有哪些
  • 怎么做营销网站推广百度搜索一下
  • 做调查问卷网挣钱的网站百度热搜榜怎么打开
  • 自己创业做原公司一样的网站百度框架户一级代理商
  • 动漫设计与制作专业学什么代码优化
  • 做网站分几种广告词
  • 京东购物商城淘宝关键词优化技巧教程
  • 海淀区网站建设百度在线客服
  • 世安建设集团有限公司网站bt兔子磁力搜索引擎最新版
  • 网站美工和平面设计师江苏seo平台
  • wordpress主题qux_v7.1网站seo关键词排名
  • 做推广要知道的网站线下推广方式都有哪些
  • 儒枫网网站建设电脑培训班一般需要多少钱
  • 品牌网站建设服务广告留电话号的网站
  • 政府门户网站建设 规范云南网站建设公司哪家好