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

Gin路由深入

        路由(Routing )是由一个 URI (或者叫路径)和一个特定的 HTTP 方法( GET POST 等)
组成的,涉及到应用如何响应客户端对某个网站节点的访问。

1GET POST 以及获取 Get Post 传值

1.1Get 请求传值

GET /user?uid=20&page=1
router.GET("/user", func(c *gin.Context) {
        uid := c.Query("uid")
        page := c.DefaultQuery("page", "0")
        c.String(200, "uid=%v page=%v", uid, page)
})

1.2、动态路由传值

域名 /user/20
r.GET("/user/:uid", func(c *gin.Context) {
        uid := c.Param("uid")
        c.String(200, "userID=%s", uid)
})

1.3Post 请求传值 获取 form 表单数据

定义一个 add_user.html 的页面
{{ define "default/add_user.html" }}
<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
</head>
<body>
        <form action="/doAddUser" method="post">
                用户名:<input type="text" name="username" />
                密码: <input type="password" name="password" />
                <input type="submit" value="提交">
        </form>
</body>
</html>
{{end}}

 通过 c.PostForm 接收表单传过来的数据

router.GET("/addUser", func(c *gin.Context) {
        c.HTML(200, "default/add_user.html", gin.H{})
})
router.POST("/doAddUser", func(c *gin.Context) {
        username := c.PostForm("username")
        password := c.PostForm("password")
        age := c.DefaultPostForm("age", "20")
        c.JSON(200, gin.H{
                "usernmae": username,
                "password": password,
                "age": age,
        })
})

 1.4、获取 GET POST 传递的数据绑定到结构体

        为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的 Content-Type
识别请求数据类型并利用反射机制自动提取请求中 QueryString form 表单、 JSON XML
参数到结构体中。 下面的示例代码演示了 .ShouldBind() 强大的功能,它能够基于请求自动提
JSON form 表单和 QueryString 类型的数据,并把值绑定到指定的结构体对象。

//注意首字母大写

type Userinfo struct {
        Username string `form:"username" json:"user"`
        Password string `form:"password" json:"password"`
}

 Get 传值绑定到结构体

/?username=zhangsan&password=123456
router.GET("/", func(c *gin.Context) {
        var userinfo Userinfo
        if err := c.ShouldBind(&userinfo); err == nil {
                c.JSON(http.StatusOK, userinfo)
        } else {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
})

 返回数据

{"user":"zhangsan","password":"123456"}
Post 传值绑定到结构体
router.POST("/doLogin", func(c *gin.Context) {
        var userinfo Userinfo
        if err := c.ShouldBind(&userinfo); err == nil {
                c.JSON(http.StatusOK, userinfo)
        } else {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
})

 返回数据

        {"user":"zhangsan","password":"123456"}

1.5、获取 Post Xml 数据

API 的开发中,我们经常会用到 JSON XML 来作为数据交互的格式,这个时候我们
可以在 gin 中使用 c.GetRawData() 获取数据。
<?xml version="1.0" encoding="UTF-8"?>
<article>
        <content type="string">我是张三 </content>
        <title type="string">张三 </title>
</article>

type Article struct {
        Title string `xml:"title"`
        Content string `xml:"content"`
}
router.POST("/xml", func (c *gin.Context) {
        b, _ := c.GetRawData() // c.Request.Body 读取请求数据
        article := &Article{}
        if err := xml.Unmarshal(b, &article); err == nil {
                c.JSON(http.StatusOK, article)
        } else {
                c.JSON(http.StatusBadRequest, err.Error())
        }
})

2、简单的路由组

https://gin-gonic.com/zh-cn/docs/examples/grouping-routes/

func main() {
        router := gin.Default()
        // 简单的路由组 : v1
        v1 := router.Group("/v1")
        {
                v1.POST("/login", loginEndpoint)
                v1.POST("/submit", submitEndpoint)
                v1.POST("/read", readEndpoint)
        }
        // 简单的路由组 : v2
        v2 := router.Group("/v2")
        {
                v2.POST("/login", loginEndpoint)
                v2.POST("/submit", submitEndpoint)
                v2.POST("/read", readEndpoint)
        }
        router.Run(":8080")
}

3Gin 路由文件 分组

3.1、新建 routes 文件夹,routes 文件下面新建 adminRoutes.goapiRoutes.go、 defaultRoutes.go

1、新建 adminRoutes.go

package routes
import (
        "net/http"
        "github.com/gin-gonic/gin"
)
func AdminRoutesInit(router *gin.Engine) {
        adminRouter := router.Group("/admin")
        {
                adminRouter.GET("/user", func(c *gin.Context) {
                        c.String(http.StatusOK, "用户")
                })
                adminRouter.GET("/news", func(c *gin.Context) {
                        c.String(http.StatusOK, "news")
                })
        }
}

 2、新建 apiRoutes.go

package routes
import (
        "net/http"
        "github.com/gin-gonic/gin"
)
func ApiRoutesInit(router *gin.Engine) {
        apiRoute := router.Group("/api")
        {
                apiRoute.GET("/user", func(c *gin.Context) {
                        c.JSON(http.StatusOK, gin.H{
                                "username": "张三",
                                "age": 20,
                        })
                })
                apiRoute.GET("/news", func(c *gin.Context) {
                        c.JSON(http.StatusOK, gin.H{
                                "title": "这是新闻",
                        })
                })
        }
}

3、新建 defaultRoutes.go 

package routes
import (
        "github.com/gin-gonic/gin"
)
func DefaultRoutesInit(router *gin.Engine) {
        defaultRoute := router.Group("/")
        {
                defaultRoute.GET("/", func(c *gin.Context) {
                c.String(200, "首页")
                })
        }
}

 3.2 、配置 main.go

package main
import (
        "gin_demo/routes"
        "github.com/gin-gonic/gin"
)
// 注意首字母大写
type Userinfo struct {
        Username string `form:"username" json:"user"`
        Password string `form:"password" json:"password"`
}
func main() {
        r := gin.Default()
        routes.AdminRoutesInit(r)
        routes.ApiRoutesInit(r)
        routes.DefaultRoutesInit(r)
        r.Run(":8080")
}

访问 /api/user /admin/user 测试 


http://www.kler.cn/a/395633.html

相关文章:

  • 接口文档的编写
  • 31-Shard Allocation Awareness(机架感知)
  • 【数据分享】全国农产品成本收益资料汇编(1953-2024)
  • Go 语言中,golang结合 PostgreSQL 、MySQL驱动 开启数据库事务
  • Serverless架构在实时数据处理中的应用
  • sealos部署K8s,安装docker时master节点突然NotReady
  • STM32芯片EXIT外部中断的配置与原理
  • FPGA 第6讲 简单组合逻辑多路选择器
  • Datawhale模型压缩技术Task2之模型剪枝
  • 基于Java Springboot旅游信息推荐系统
  • 全面解读 USB Key:定义、使用场景、加密技术及 Java 实现
  • linux之调度管理(5)-实时调度器
  • 【计算机网络】TCP协议特点3
  • 通过地址获取LONG和LAT并且存入csv
  • ubuntu, 安装部署comfyui,记录1:
  • Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
  • 计算机毕业设计Python+CNN卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 千益畅行,共享旅游卡市场乱象解析与未来展望
  • Python3中str和bytes
  • STM32串口——5个串口的使用方法
  • selenium元素定位---元素点击交互异常解决方法
  • 0x00基础算法 -- 0x05 排序
  • Modern Effective C++:item 1 理解模板类型推导
  • Spring Boot 中使用 @Transactional 注解配置事务管理
  • 表的数据结构和常见操作
  • 硬盘物理故障的表现、原因和解决方法全解析