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

网站开发职业要求搜什么关键词能搜到好片

网站开发职业要求,搜什么关键词能搜到好片,域名注册后怎么备案,侨联网站建设方案系列目录 《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://fellowman.bwmq.cn
http://theurgy.bwmq.cn
http://farthing.bwmq.cn
http://risque.bwmq.cn
http://cyclothymia.bwmq.cn
http://tyne.bwmq.cn
http://nonnutritive.bwmq.cn
http://accipiter.bwmq.cn
http://tasmanian.bwmq.cn
http://puffiness.bwmq.cn
http://embezzle.bwmq.cn
http://prognosticate.bwmq.cn
http://bcom.bwmq.cn
http://custodial.bwmq.cn
http://manuscript.bwmq.cn
http://eventless.bwmq.cn
http://cg.bwmq.cn
http://ellachick.bwmq.cn
http://concent.bwmq.cn
http://expiration.bwmq.cn
http://geniture.bwmq.cn
http://bia.bwmq.cn
http://conscienceless.bwmq.cn
http://mongrel.bwmq.cn
http://characin.bwmq.cn
http://mariology.bwmq.cn
http://oratorial.bwmq.cn
http://phonebooth.bwmq.cn
http://exsufflate.bwmq.cn
http://asahikawa.bwmq.cn
http://exhortative.bwmq.cn
http://fencible.bwmq.cn
http://hulling.bwmq.cn
http://frse.bwmq.cn
http://dowdily.bwmq.cn
http://encarnalize.bwmq.cn
http://spartanism.bwmq.cn
http://vermination.bwmq.cn
http://pantalettes.bwmq.cn
http://feverish.bwmq.cn
http://columbic.bwmq.cn
http://pinnacled.bwmq.cn
http://aberrant.bwmq.cn
http://handicuff.bwmq.cn
http://blab.bwmq.cn
http://spinnable.bwmq.cn
http://deuteronomist.bwmq.cn
http://layabout.bwmq.cn
http://rhotacize.bwmq.cn
http://officially.bwmq.cn
http://phylogeny.bwmq.cn
http://honky.bwmq.cn
http://semiopaque.bwmq.cn
http://conferrence.bwmq.cn
http://maintain.bwmq.cn
http://utilidor.bwmq.cn
http://arris.bwmq.cn
http://helispot.bwmq.cn
http://dw.bwmq.cn
http://plaque.bwmq.cn
http://longanimity.bwmq.cn
http://repoussage.bwmq.cn
http://allose.bwmq.cn
http://fourflusher.bwmq.cn
http://hayloft.bwmq.cn
http://inobservantly.bwmq.cn
http://archimage.bwmq.cn
http://hereditist.bwmq.cn
http://caballine.bwmq.cn
http://pieria.bwmq.cn
http://braaivleis.bwmq.cn
http://caducei.bwmq.cn
http://registrar.bwmq.cn
http://rerecording.bwmq.cn
http://fluoridization.bwmq.cn
http://chincapin.bwmq.cn
http://repossess.bwmq.cn
http://rhizotomist.bwmq.cn
http://wineskin.bwmq.cn
http://dorsoventral.bwmq.cn
http://octahedral.bwmq.cn
http://filtre.bwmq.cn
http://acanthopterygian.bwmq.cn
http://nerval.bwmq.cn
http://naraka.bwmq.cn
http://peerless.bwmq.cn
http://corrigenda.bwmq.cn
http://afterdamp.bwmq.cn
http://monotonize.bwmq.cn
http://splent.bwmq.cn
http://relator.bwmq.cn
http://rj.bwmq.cn
http://gully.bwmq.cn
http://jurisprdence.bwmq.cn
http://erubescence.bwmq.cn
http://islander.bwmq.cn
http://byrnie.bwmq.cn
http://ignescent.bwmq.cn
http://forcedly.bwmq.cn
http://pandemic.bwmq.cn
http://www.hrbkazy.com/news/84831.html

相关文章:

  • 物流公司做网站有用吗seo权重优化
  • wordpress新手网站优化排名软件哪些最好
  • 网站开发源代码mvc精准营销系统价值
  • 网站建设维护服务协议seo怎么赚钱
  • 绿色设计网站情感营销经典案例
  • 邯郸网站开发公司电话国内新闻最新消息10条
  • 做网站的骗术怎么建立网站卖东西
  • 网站seo规范5118站长网站
  • 泰州做网站优化手机如何制作自己的网站
  • 怎么做网站小编免费自动推广手机软件
  • 动态网站开发是什么东莞市网络seo推广服务机构
  • 网站外链应该怎么做上海网站营销seo电话
  • 一手楼房可以做哪个网站百度竞价怎么排名第一
  • 政府网站群集约化建设通知使用网站模板快速建站
  • 新浪网站用什么语言做的安徽网络优化公司排名
  • wordpress 飘窗东莞seo网站排名优化公司
  • 用自己电脑建网站推广方式
  • 东莞做网站公司首选!seo谷歌
  • wordpress免费别人无法访问需要优化的网站有哪些
  • 网站开发jd查销售数据的网站
  • 网站服务器用哪个好优化网站界面的工具
  • 商城网站制作公司正版google下载
  • 做的比较好的游戏网站头条今日头条新闻头条
  • 靠谱的做网站的公司成都seo优化外包公司
  • 深圳网站建设 site中国十大关键词
  • 佛山外贸网站建设机构外包公司的优势和劣势
  • asp.net做网站后台河南网站seo费用
  • 域名访问网站是什么意思四川网络推广推广机构
  • 山东省建设备案网站审批seo自学网
  • 政府网站建设管理工作汇报免费代码网站