gin 框架(三) | 青训营笔记

120 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 15 天

概述

  • 重定向:重定向和转发
  • 路由

重定向

转发和重定向的区别

Forward(转发):服务器内部执行,对客户端是黑盒子。

image.png

redirect(重定向):服务器返回信息,客户端自动向另一个地址发请求

image.png

HTTP重定向(重定向)

r.GET("/", func(c *gin.Context) {
        c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})

路由重定向(转发)

r.GET("/a", func(c *gin.Context) {
    c.Request.URL.Path = "/b" // 重定向到b
    r.HandleContext(c)        // 一些处理
})
r.GET("/b", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"message": "b"})
})

image.png

Gin 路由

r.Any("/user", func(c *gin.Context) {
    switch c.Request.Method {
    case http.MethodGet:
        c.JSON(http.StatusOK, gin.H{"method": "GET"})
    case http.MethodPost:
        c.JSON(http.StatusOK, gin.H{"method": "POST"})
    case http.MethodPut:
        c.JSON(http.StatusOK, gin.H{"method": "PUT"})
    case http.MethodDelete:
        c.JSON(http.StatusOK, gin.H{"method": "DELETE"})
    }
})

Any 可以接收 GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE 请求方法

将相同路由的不同请求放在一起,和路由组的理念相同。

在使用的时候还要注意开发规范,尽量减少魔法值【参考5】。所以用 http 封装的常量来替代字符串

404

r.NoRoute(func(c *gin.Context) {
    c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "Not Found"})
})

这里只是演示处理方法,实际情况自行处理。

路由组

顾名思义,路由组是将不同的路由依据前缀分组。

路由组示例

userGroup := r.Group("/user")
{
    userGroup.GET("/index", func(c *gin.Context) {...})
    userGroup.GET("/login", func(c *gin.Context) {...})
    userGroup.POST("/login", func(c *gin.Context) {...})
}

相当于 /user/index...

使用路由组,整体代码的结构就会更加清晰,路由关系也会更加明了。使用路由组让你的代码更优雅。

路由组嵌套

gin 中的路由组是支持嵌套的,如下

shopGroup := r.Group("/shop")
{
    shopGroup.GET("/index", func(c *gin.Context) {...})
    shopGroup.GET("/cart", func(c *gin.Context) {...})
    shopGroup.POST("/checkout", func(c *gin.Context) {...})
    // 嵌套路由组
    xx := shopGroup.Group("xx")
    xx.GET("/oo", func(c *gin.Context) {...})
}

路由原理

gin 框架中的路由是使用的 httprouter 这个库。其主要的原理就是构造一个路由前缀树

image.png

参考

  1. 特性 | Gin Web Framework (gin-gonic.com)
  2. 快速入门 | 正文 |《Gin 框架中文文档 1.7》| Go 技术论坛 (learnku.com)
  3. Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com)
  4. Restful风格的API · Go语言中文文档 (topgoer.com)
  5. 什么是转发和重定向?两者之间有什么区别?
  6. 用魔法打败魔法——解决Java代码中的魔法值 - 掘金 (juejin.cn)
  7. 关于 GIN 的路由树 - 知乎 (zhihu.com)