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

站长工具综合查询官网/免费百度下载

站长工具综合查询官网,免费百度下载,微信网站怎么做的好处,法院网站建设概述上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证。有读者咨询我一个问题,如何让框架的运行日志不输出控制台?解决方案:engine : gin.Default() //修改成如下engine : gin.New() 我是…

概述

上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证。

有读者咨询我一个问题,如何让框架的运行日志不输出控制台?

解决方案:

engine := gin.Default() //修改成如下

engine := gin.New()

我是怎么知道的?看框架代码。

Default()

func Default() *Engine {

debugPrintWARNINGDefault()

engine := New()

engine.Use(Logger(), Recovery())

return engine

}

New() 代码我就不贴了。

我们看到 Default() 使用了两个中间件 Logger(),Recovery(),如果不想使用,那就直接使用 New() 就可以了。

开始今天的文章。

比如,请求 v1/member/add 新增会员方法, nameage 为必填,同时 name 不能等于 admin 字符串,10 <= age <= 120。

直接看代码吧。

首先,先定义一个结构体。

entity/member.go

package entity

// 定义 Member 结构体

type Member struct {

Name string `form:"name" json:"name" binding:"required,NameValid"`

Age int `form:"age" json:"age" binding:"required,gt=10,lt=120"`

}

binding 中 required,这个是框架自带的, NameValid,这个是自己定义的。

问题一:框架自带的 binding 参数还有哪些?

问题二:自定义验证方法,怎么写?

接下来要说的就是问题二,写一个验证方法。

validator/member/member.go

package member

import (

"gopkg.in/go-playground/validator.v8"

"reflect"

)

func NameValid(

v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value,

field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string,

) bool {

if s, ok := field.Interface().(string); ok {

if s == "admin" {

return false

}

}

return true

}

接下来,在路由中绑定:

router/router.go

package router

import (

"ginDemo/middleware/logger"

"ginDemo/middleware/sign"

"ginDemo/router/v1"

"ginDemo/router/v2"

"ginDemo/validator/member"

"github.com/gin-gonic/gin"

"github.com/gin-gonic/gin/binding"

"gopkg.in/go-playground/validator.v8"

)

func InitRouter(r *gin.Engine) {

r.Use(logger.LoggerToFile())

// v1 版本

GroupV1 := r.Group("/v1")

{

GroupV1.Any("/product/add", v1.AddProduct)

GroupV1.Any("/member/add", v1.AddMember)

}

// v2 版本

GroupV2 := r.Group("/v2").Use(sign.Sign())

{

GroupV2.Any("/product/add", v2.AddProduct)

GroupV2.Any("/member/add", v2.AddMember)

}

// 绑定验证器

if v, ok := binding.Validator.Engine().(*validator.Validate); ok {

v.RegisterValidation("NameValid", member.NameValid)

}

}

最后,看一下调用的代码。

router/v1/member.go

package v1

import (

"ginDemo/entity"

"github.com/gin-gonic/gin"

"net/http"

)

func AddMember(c *gin.Context) {

res := entity.Result{}

mem := entity.Member{}

if err := c.ShouldBind(&mem); err != nil {

res.SetCode(entity.CODE_ERROR)

res.SetMessage(err.Error())

c.JSON(http.StatusForbidden, res)

c.Abort()

return

}

// 处理业务(下次再分享)

data := map[string]interface{}{

"name" : mem.Name,

"age" : mem.Age,

}

res.SetCode(entity.CODE_ERROR)

res.SetData(data)

c.JSON(http.StatusOK, res)

}

访问看看效果吧。

访问:http://localhost:8080/v1/member/add

{

"code": -1,

"msg": "Key: 'Member.Name' Error:Field validation for 'Name' failed on the 'required' tag\nKey: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?name=1

{

"code": -1,

"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?age=1

{

"code": -1,

"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'required' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?name=admin&age=1

{

"code": -1,

"msg": "Key: 'Member.Name' Error:Field validation for 'Name' failed on the 'NameValid' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?name=1&age=1

{

"code": -1,

"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'gt' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?name=1&age=121

{

"code": -1,

"msg": "Key: 'Member.Age' Error:Field validation for 'Age' failed on the 'lt' tag",

"data": null

}

访问:http://localhost:8080/v1/member/add?name=Tom&age=30

{

"code": 1,

"msg": "",

"data": {

"age": 30,

"name": "Tom"

}

}

为避免返回信息过多,错误提示咱们也可以统一。

if err := c.ShouldBind(&mem); err != nil {

res.SetCode(entity.CODE_ERROR)

res.SetMessage("参数验证错误")

c.JSON(http.StatusForbidden, res)

c.Abort()

return

}

这一次目录结构调整了一些,在这里说一下:

├─ ginDemo

│ ├─ common //公共方法

│ ├── common.go

│ ├─ config //配置文件

│ ├── config.go

│ ├─ entity //实体

│ ├── ...

│ ├─ middleware //中间件

│ ├── logger

│ ├── ...

│ ├── sign

│ ├── ...

│ ├─ router //路由

│ ├── ...

│ ├─ validator //验证器

│ ├── ...

│ ├─ vendor //扩展包

│ ├── github.com

│ ├── ...

│ ├── golang.org

│ ├── ...

│ ├── gopkg.in

│ ├── ...

│ ├─ Gopkg.toml

│ ├─ Gopkg.lock

│ ├─ main.go

signlogger 调整为中间件,并放到 middleware 中间件 目录。

新增了 common 公共方法目录。

新增了 validator 验证器目录。

新增了 entity 实体目录。

具体代码我会放到 GitHub,有感兴趣的可以去看:https://github.com/xinliangnote/Go。

上面还遗漏了 问题一 没解决,框架自带的 binding 参数还有哪些?

从框架源码了解到验证使用的是:

gopkg.in/go-playground/validator.v8

文档地址为:

https://godoc.org/gopkg.in/go-playground/validator.v8

去探索文档吧,里面有很多验证规则。

推荐阅读

Gin 框架

  • Gin 框架 - 使用 Logrus 日志记录

  • Gin 框架 - 安装和路由配置

基础篇

  • Go - 函数

  • Go - 循环

  • Go - Map 集合

  • Go - Struct 结构体

  • Go - Slice 切片

  • Go - 数组

  • Go - 变量声明

  • Go - 环境安装

本文欢迎转发,转发请注明作者和出处,谢谢!

e6d4664d2705301b5ffd52dd13c7d6d4.png

http://www.jmfq.cn/news/5216005.html

相关文章:

  • 做网站 提要求/深圳搜索seo优化排名
  • 长沙seo关键词/seo推广软件
  • 什么网站做贸易好/seo培训
  • 北京丰台做网站/有什么平台可以推广信息
  • 国内网站放国外服务器/海淀网站建设公司
  • 做网站那个php好用/南宁seo排名首页
  • 政府集约化网站建设建议/关键词排名的排名优化
  • 凯里建设网站/网络营销常用的工具
  • 国内做香港视频网站/在线代理浏览国外网站
  • 网站建设的意思/东莞网站建设优化排名
  • 程序员做任务的网站/seo全称是什么
  • 门户网站建设平台/百度开户需要什么条件
  • 网站源码是用什么做的/国际新闻消息
  • 黄石商城网站建设/百度网盘登录入口网页版
  • 买域名做网站跳转/今日足球比赛预测推荐分析
  • 联谊会总结网站建设对外宣传/软文广告怎么写
  • 58做网站一年多少钱/微信客户管理系统平台
  • php网站开发技术代码/如何做好营销
  • 常州个人做网站/视频号链接怎么获取
  • 武汉小程序开发公司/西安区seo搜索排名优化
  • 深圳专业优定软件网站建设/电商代运营收费标准
  • 手机版网站做一下多少钱/百度软件中心官网
  • 网站系统建设需要什么/短期培训班学什么好
  • 聊城冠县网站建设/百度app下载
  • 为什么要建设网站/网站keywords
  • 科技经济导刊官网/福建seo网站
  • 做网页引用别的网站的视频/百度seo正规优化
  • 手机建站程序免费下载/短视频营销方式有哪些
  • 抖音推广运营/太原seo哪家好
  • 张家港做政府网站的公司/东莞seo关键词排名优化排名