Gin知识点整理

1.默认路由实例

router := gin.Default()

2. 路由分组

goodsGroup := router.Group("/goods")
{
    goodsGroup.Get("/list",goodList)
}
  • 处理请求函数
func goodsList(c *gin.Context){
   c.JSON(200, gin.H{
      "name":"List",
      })
}

3. 获取url的参数

  • 不设规则 只是获取参数
goodsGroup := router.Group("/goods")
{
   goodsGroup.GET("/:id/:action",goodsDetail)
}

func goodsDetail(c *gin.Context){
    id := c.Param("id")
    action := c.Param("action")
    c.JSON(200,gin.H{
       "id": id,
       "action": action,
    })  
}  
  • 设规则
// 定义Person结构体,用于绑定URI参数
type Person struct{
  ID int `uri:"id" binding:"required"`
  Name string `uri:"name" binding:"required"`
}

func main(){
  router := gin.Default()
  router.GET("/:name/:id",func(c *gin.Context) {
       var person Person
       if err := c.ShouldBindUri(&person); err != nil {
          c.Status(404)
          return
       }
       c.JSON(http.StatusOK,gin.H{
         "name":person.Name,
         "id": person.ID,
        })   
   })
   router.Run()     

4. 获取 get和post表单信息

router.POST("/post",getPost)

func getPost(c *gin.Context) {
   id := c.Query("id")
   page := c.DefaultQuery("page","0")
   name := c.PostForm("name")
   message := c.DefaultPostForm("message","信息")
   c.JSON(http.StatusOK,gin.H{
      "id": id,
      "page":page,
      "name":name,
      "message":message,
   })
 }  

5. gin返回protobuf

router.GET("/someProtoBuf",returnProto)

func returnProto(c *gin.Context){
   course := []string{"python","go","微服务"}
   user := &proto.Teacher{
     Name: "bobby",
     Course: course,
   }
   c.ProtoBuf(http.StatusOK,user)
}     

6. 表单验证

package main

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

// LoginForm 定义了登录请求的数据结构和验证规则
type LoginForm struct {
	User     string `json:"user" binding:"required,min=3,max=10"` // 用户名字段,必填,长度3到10
	Password string `json:"password" binding:"required"`          // 密码字段,必填
}

// SignUpForm 定义了注册请求的数据结构和验证规则
type SignUpForm struct {
	Age        uint8  `json:"age" binding:"gte=1,lte=130"`                    // 年龄字段,范围1到130
	Name       string `json:"name" binding:"required,min=3"`                  // 名字字段,必填,至少3个字符
	Email      string `json:"email" binding:"required,email"`                 // 邮箱字段,必填,必须是有效的邮箱格式
	Password   string `json:"password" binding:"required"`                    // 密码字段,必填
	Repassword string `json:"repassword" binding:"required,eqfield=Password"` // 重复密码字段,必填,必须和密码字段一致
}

func main() {
	router := gin.Default() // 创建一个默认的 Gin 路由器实例

	router.POST("/loginJSON", func(c *gin.Context) { // 定义一个处理 POST /loginJSON 请求的路由
		var loginForm LoginForm
		if err := c.ShouldBind(&loginForm); err != nil { // 绑定请求数据到 loginForm 结构体,并验证
			fmt.Println(err.Error())             // 输出错误信息到控制台
			c.JSON(http.StatusBadRequest, gin.H{ // 返回 400 状态码和错误信息
				"error": err.Error(),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{ // 返回 200 状态码和成功信息
			"msg": "登录成功",
		})
	})

	router.POST("/signup", func(c *gin.Context) { // 定义一个处理 POST /signup 请求的路由
		var signUpForm SignUpForm
		if err := c.ShouldBind(&signUpForm); err != nil { // 绑定请求数据到 signUpForm 结构体,并验证
			fmt.Println(err.Error())             // 输出错误信息到控制台
			c.JSON(http.StatusBadRequest, gin.H{ // 返回 400 状态码和错误信息
				"error": err.Error(),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{ // 返回 200 状态码和成功信息
			"msg": "注册成功",
		})
	})

	router.Run(":8080") // 启动 HTTP 服务器,监听端口 8080
}

7. 表单验证错误翻译成中文

package main

import (
	"fmt"
	"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"
	"net/http"
)

// LoginForm 定义了登录请求的数据结构和验证规则
type LoginForm struct {
	User     string `json:"user" binding:"required,min=3,max=10"` // 用户名字段,必填,长度3到10
	Password string `json:"password" binding:"required"`          // 密码字段,必填
}

// SignUpForm 定义了注册请求的数据结构和验证规则
type SignUpForm struct {
	Age        uint8  `json:"age" binding:"gte=1,lte=130"`                    // 年龄字段,范围1到130
	Name       string `json:"name" binding:"required,min=3"`                  // 名字字段,必填,至少3个字符
	Email      string `json:"email" binding:"required,email"`                 // 邮箱字段,必填,必须是有效的邮箱格式
	Password   string `json:"password" binding:"required"`                    // 密码字段,必填
	Repassword string `json:"repassword" binding:"required,eqfield=Password"` // 重复密码字段,必填,必须和密码字段一致
}

var trans ut.Translator // 声明一个全局变量,用于存储翻译器

// InitTrans 初始化翻译器
func InitTrans(locale string) (err error) {
	// 修改 gin 框架中的 validator 引擎属性,实现定制
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		zhT := zh.New()                       // 创建中文翻译器
		enT := en.New()                       // 创建英文翻译器
		uni := ut.New(enT, zhT, zhT)          // 创建 Universal Translator
		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
}

func main() {
	if err := InitTrans("zh"); err != nil { // 初始化翻译器,选择中文
		fmt.Println("初始化翻译器错误") // 初始化失败时输出错误信息
		return
	}
	router := gin.Default() // 创建一个默认的 Gin 路由器实例

	router.POST("/loginJSON", func(c *gin.Context) { // 定义一个处理 POST /loginJSON 请求的路由
		var loginForm LoginForm
		if err := c.ShouldBind(&loginForm); err != nil { // 绑定请求数据到 loginForm 结构体,并验证
			errs, ok := err.(validator.ValidationErrors) // 判断错误类型是否为验证错误
			if !ok {                                     // 如果不是验证错误
				c.JSON(http.StatusBadRequest, gin.H{
					"error": err.Error(), // 返回错误信息
				})
			}
			fmt.Println(err.Error())             // 输出错误信息到控制台
			c.JSON(http.StatusBadRequest, gin.H{ // 返回 400 状态码和翻译后的错误信息
				"error": errs.Translate(trans),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{ // 返回 200 状态码和成功信息
			"msg": "登录成功",
		})
	})

	router.POST("/signup", func(c *gin.Context) { // 定义一个处理 POST /signup 请求的路由
		var signUpForm SignUpForm
		if err := c.ShouldBind(&signUpForm); err != nil { // 绑定请求数据到 signUpForm 结构体,并验证
			errs, ok := err.(validator.ValidationErrors) // 判断错误类型是否为验证错误
			if !ok {                                     // 如果不是验证错误
				c.JSON(http.StatusBadRequest, gin.H{
					"error": err.Error(), // 返回错误信息
				})
			}
			fmt.Println(err.Error())             // 输出错误信息到控制台
			c.JSON(http.StatusBadRequest, gin.H{ // 返回 400 状态码和翻译后的错误信息
				"error": errs.Translate(trans),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{ // 返回 200 状态码和成功信息
			"msg": "注册成功",
		})
	})

	router.Run(":8080") // 启动 HTTP 服务器,监听端口 8080
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值