[系列] - go-gin-api 规划目录和参数验证(二)


本文摘自网络,作者,侵删。

概述

首先同步下项目概况:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上篇文章分享了,使用 go modules 初始化项目,这篇文章咱们分享:

  • 规划目录结构

  • 模型绑定和验证

  • 自定义验证器

  • 制定 API 返回结构

废话不多说,咱们开始吧。

规划目录结构

├─ go-gin-api
│  ├─ app
│     ├─ config           //配置文件
│        ├─ config.go
│     ├─ controller       //控制器层
│        ├─ param_bind
│        ├─ param_verify
│        ├─ ...
│     ├─ model            //数据库ORM
│        ├─ proto
│        ├─ ...
│     ├─ repository       //数据库操作层
│        ├─ ...
│     ├─ route            //路由
│        ├─ middleware
│        ├─ route.go
│     ├─ service          //业务层
│        ├─ ...
│     ├─ util             //工具包
│        ├─ ...
│  ├─ vendor  //依赖包
│     ├─ ...
│  ├─ go.mod
│  ├─ go.sum
│  ├─ main.go //入口文件

上面的目录结构是我自定义的,大家也可以根据自己的习惯去定义。

controller 控制器层主要对提交过来的数据进行验证,然后将验证完成的数据传递给 service 处理。

在 gin 框架中,参数验证有两种:

1、模型绑定和验证。

2、自定义验证器。

其中目录 param_bind,存储的是参数绑定的数据,目录 param_verify 存储的是自定义验证器。

接下来,让咱们进行简单实现。

模型绑定和验证

比如,有一个创建商品的接口,商品名称不能为空。

配置路由(route.go):

ProductRouter := engine.Group("")
{
    // 新增产品
    ProductRouter.POST("/product", product.Add)
    // 更新产品
    ProductRouter.PUT("/product/:id", product.Edit)
    // 删除产品
    ProductRouter.DELETE("/product/:id", product.Delete)
    // 获取产品详情
    ProductRouter.GET("/product/:id", product.Detail)
}

参数绑定(param_bind/product.go):

type ProductAdd struct {
    Name string `form:"name" json:"name" binding:"required"`
}

控制器调用(controller/product.go):

if err := c.ShouldBind(&param_bind.ProductAdd{}); err != nil {
    utilGin.Response(-1, err.Error(), nil)
    return
}

咱们用 Postman 模拟 post 请求时,name 参数不传或传递为空,会出现:

Key: 'ProductAdd.Name' Error:Field validation for 'Name' failed on the 'required' tag

这说明使用到了参数设置的 binding:"required"。

那么还能使用 binding 哪些参数,有文档吗?

有。Gin 使用 go-playground/validator.v8 进行验证,相关文档:

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

接下来,咱们实现一下自定义验证器。

自定义验证器

比如,有一个创建商品的接口,商品名称不能为空并且参数名称不能等于 admin。

类似于这种业务需求,无法 binding 现成的方法,需要我们自己写验证方法,才能实现。

阅读剩余部分

相关阅读 >>

Golang 能不能打包为 dll ?

etcd包导入坑

vim--Golang开发配置

2021-02-22

Golang 如何并发

linux下怎么安装Go语言环境

手撸Golang 基本数据结构与算法 栈

Go compiler intrinsics(文末赠书)

Go语言happens-before原则及应用

Go语言队列的链式表示和实现

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...