golang gin——controller 模型绑定与参数校验

controller 模型绑定与参数校验

gin框架提供了多种方法可以将请求体的内容绑定到对应struct上,并且提供了一些预置的参数校验

绑定方法

根据数据源和类型的不同,gin提供了不同的绑定方法

  • Bind, shouldBind: 从form表单中去绑定对象
  • BindJSON, shouldBindJSON: 这两个方法是从json表单中去绑定对象
  • 还有从xml,protobuf等等
参数校验

gin提供了一系列预置的参数校验,可以参考官方文档。 用binding 标签

  • required 必须参数

  • number 要求数字

  • omitempty 允许为空

  • email 邮件格式

等等

实例
go 复制代码
package course

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func InitRouters(r *gin.Engine) {
	//使用路由分组
	api := r.Group("api")
	initCourse(api)
}

func initCourse(group *gin.RouterGroup) {
	// 路由分组
	v1 := group.Group("/v1")
	{
		// /api/v1/course
		// 路径携带参数
		v1.GET("/course/search/:id", course.Get)
		v1.POST("/course/add/:id", course.Add)
		v1.PUT("/course/edit/:id", course.Edit)
		v1.DELETE("/course/del", course.Delete)
	}
}

// 模型绑定, gin 引用了 validator,有一些预置标签
type course struct {
	Name string 		`json:"name"     form:"name" binding:"required"`
	Teacher string		`json:"teacher"  form:"teacher" binding:"required"`
	Duration int		`json:"duration" form:"duration" binding:"number"`
}

func Add(c *gin.Context) {
	req := &course{}


	// 从form表单去绑定 c.Bind() c.ShouldBind()
	// 从json里去取值 c.BindJSON()
	// 带should的bind 可以去返回错误,不带的会直接响应请求

	err := c.ShouldBindJSON(req)

	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"error": err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, req)
}

func Get(c *gin.Context) {
	// 获取路径上的参数
	id := c.Param("id")

	// 都是gin.context作为入参
	c.JSON(http.StatusOK, gin.H{
		"method": c.Request.Method,
		"path": c.Request.URL.Path,
		"id": id,
	})
}

func Edit(c *gin.Context) {
	req := &course{}
	err := c.ShouldBindJSON(req)

	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"error": err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"method": c.Request.Method,
		"path": c.Request.URL.Path,
		"req": req,
	})
}

func Delete(c *gin.Context) {
	// 从queryString 获取
	id := c.Query("id")
	// 都是gin.context作为入参
	c.JSON(http.StatusOK, gin.H{
		"method": c.Request.Method,
		"path": c.Request.URL.Path,
		"id": id,
	})
}
测试
相关推荐
郝学胜-神的一滴4 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
测试员周周4 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
摇滚侠5 小时前
@Autowired 和 @Resource 的区别
java·开发语言
Wy_编程5 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel5 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
大卡片6 小时前
C++的基础知识点
开发语言·c++
郑同学的笔记6 小时前
【Qt教程29】Qt5和Qt6版本对比
开发语言·qt
基德爆肝c语言6 小时前
Qt 主窗口全家桶:菜单栏、工具栏、状态栏与对话框完全指南
开发语言·qt
lolo大魔王7 小时前
Go 后端实战|Gin + GORM V2 + MySQL 企业级 API 项目开发(完整版)
mysql·golang·gin
XMYX-08 小时前
28 - Go JSON 数据操作
开发语言·golang·json