浅谈Gin框架的使用(一)

485 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

今天来简单学习下Gin框架入门,Gin框架使用 Go/golang 语言实现的 HTTP Web 框架,拥有更好性能的API框架

Gin框架介绍

GO语言中Web框架之一,Github上有64K+star。 基于httprouter开发的Web框架。 中文文档齐全,简单易用的轻量级框架,它具有类似 Martini 的 API,但性能比 Martini 快 40 倍.

快速入门

下载安装

$ go get -u -v github.com/gin-gonic/gin

-v:打印出被构建的代码包的名字
-u:已存在相关的代码包,强行更新代码包及其依赖包


package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/test", func(c *gin.Context) {	
            // c.JSON:返回JSON格式的数据
		c.JSON(200, gin.H{
			"message": "Hello world!",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

将上述代码保存编译执行,然后用浏览器打开127.0.0.1:8080/test就能可以到一串JSON字符串。

image.png

  1. 一开始用gin.Default()初始化了一个实例
  2. 紧接着使用r.Get("/test", ...)声明了一个test路由,告诉 Gin 什么样的URL可以触发这个函数,函数的返回值就是返回给前端的数据,前端在渲染出来
  3. 最后用 r.Run()函数来让应用运行在本地服务器上,默认监听端口是 8080,可以传入参数设置端口,例如r.Run(":8888")即运行在 8888端口

image.png

Route路由

路由方法有Get,POST,PUT,PATCH,DELETE,OPTIONS,ANY(可以匹配任意类型的请求)

  • GET用来获取资源
  • POST用来新建资源
  • PUT用来更新资源
  • DELETE用来删除资源。
// 无参数
r.GET("/", func(c *gin.Context) {
    c.String(http.StatusOK, "I am YYQQ")
})

解析路径参数,通过不同的url传入不同的数据,例如 /user/:name/*role *代表可选参数

// 匹配 /user/YYQQ
r.GET("/user/:name", func(c *gin.Context) {
	name := c.Param("name")
	c.String(http.StatusOK, "I am %s", name)
})
$ curl http://localhost:8080/user/YYQQ
  I am YYQQ

获取Query参数,例如 users?name=xxx&role=xxx

// 匹配users?name=xxx&role=xxx,role可选
r.GET("/users", func(c *gin.Context) {
	name := c.Query("name")
	role := c.DefaultQuery("role", "student")
	c.String(http.StatusOK, "%s is a %s", name, role)
})
$ curl "http://localhost:8080/users?name=YYQQ&role=student"
I am YYQQ, role is student

获取POST参数

// POST
r.POST("/form", func(c *gin.Context) {
	username := c.PostForm("username")
	password := c.DefaultPostForm("password", "000000") // 可设置默认值

	c.JSON(http.StatusOK, gin.H{
		"username": username,
		"password": password,
	})
})

image.png

image.png

Query和POST参数混合

// GET 和 POST 混合
r.POST("/posts", func(c *gin.Context) {
	id := c.Query("id")
	page := c.DefaultQuery("page", "0")
	username := c.PostForm("username")
	password := c.DefaultPostForm("username", "000000") // 可设置默认值

	c.JSON(http.StatusOK, gin.H{
		"id":       id,
		"page":     page,
		"username": username,
		"password": password,
	})
})

image.png

重定向Redirect

HTTP 重定向很容易, 内部、外部重定向均支持

路由重定向,使用 HandleContext

通过 POST 方法进行 HTTP 重定向,使用http.StatusFound

func main() {
   r := gin.Default()
   
   //http重定向
   r.GET("/redirect", func(c *gin.Context) {
      c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
   })

    //路由重定向
   r.GET("/goindex", func(c *gin.Context) {
      c.Request.URL.Path = "/"
      r.HandleContext(c)
   })
   //post 重定向
   r.POST("/goindex", func(c *gin.Context) {
          c.Redirect(http.StatusFound, "/")
    })

   r.GET("/", func(c *gin.Context) {
      // c.JSON:返回JSON格式的数据
      c.JSON(200, gin.H{
         "message": "Hello world!",
      })
   })
   r.Run() // listen and serve on 0.0.0.0:8080
}

分组路由

如果一组的路由前缀都是/api/v1开头是不是每个路由前面都要加上/api/v1呢,显然是很麻烦的

通过分组路由可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中去,简化权限控制。

// group routes 分组路由
defaultHandler := func(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"path": c.FullPath(),
	})
}
// group: v1
// {} 是书写规范
v1 := r.Group("/v1")
{
   v1.GET("/post", defaultHandler)
   v1.GET("/update", defaultHandler)
}
// group: v2
v2 := r.Group("/v2")
{
   v1.GET("/post", defaultHandler)
   v1.GET("/update", defaultHandler)
}

image.png

总结

今天简单的学习了Gin安装、路由知识,接来下会继续学习Gin的数据绑定等知识,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!