Gin框架学习 --- 文件、路由、中间件应用

1. 文件上传

文件上传前端页面代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="f1">
    <input type="submit" value="上传">

</form>
</body>
</html>

后端gin框架代码:

package main

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

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("src/go_code/project05/index.html")
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	r.POST("/upload", func(c *gin.Context) {
		//从请求中读取文件
		f, err := c.FormFile("f1")

		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		} else {
			// 将读取到的文件保存在本地
			dst := fmt.Sprintf("./%s", f.Filename)
			c.SaveUploadedFile(f, dst)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}
	})

	r.Run(":9090")
}

2. gin请求重定向

package main

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

func main() {
	r := gin.Default()
	r.GET("/index", func(c *gin.Context) {
		//跳转到百度
		c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
	})

	r.GET("/a", func(c *gin.Context) {
		//跳转到 /b 对应的路由处理函数
		c.Request.URL.Path = "/b"
		r.HandleContext(c)
	})

	r.GET("/b", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "b",
		})
	})

	r.Run(":9090")
}

3. gin路由和路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。路由组也支持嵌套 采用group方法进行分组

package main

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

func main() {
	r := gin.Default()

	userGroup := r.Group("/user")
	{
		userGroup.GET("/index", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"message": "/user/index",
			})
		})

		userGroup.GET("/login", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"message": "/user/login",
			})
		})

		xx := userGroup.Group("/xx")
		xx.GET("/oo", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"message": "/user/xx/oo",
			})
		})

		//为没有配置处理函数的路由添加处理程序
		r.NoRoute(func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{
				"message": "this is a 404 page",
			})
		})

		r.Run(":9090")
	}

}

对于没配置处理函数的路由 可以使用r.NoRoute 添加处理程序

4. gin中间件

Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

  • 定义中间件
    Gin中的中间件必须是一个gin.HandlerFunc类型。
package main

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

// 定义一个中间件
func indexHandle(c *gin.Context) {
	fmt.Println("index")
	c.JSON(http.StatusOK, gin.H{
		"code":    "success",
		"message": "GET",
	})
}

func timeHandle(c *gin.Context) {
	fmt.Println("index2")
	start := time.Now()
	time.Sleep(time.Second)
	c.JSON(http.StatusOK, gin.H{
		"code":    "success",
		"message": "GET",
	})

	c.Next()

	cost := time.Since(start)
	fmt.Println("消耗的时间:", cost)
}

// 鉴权中间件
func authMiddleware(docheck bool) gin.HandlerFunc {
	//连接数据库
	//一些其他工作
	return func(c *gin.Context) {
		// 存放具体的逻辑
		// 是否登录的判断
		// if是登录用户
		// c.Next()
		// else
		// c.Abort()
	}
}

func main() {
	r := gin.Default()

	r.Use(timeHandle)

	r.GET("/index", indexHandle)
	r.GET("/home", indexHandle)

	r.Run(":7070")
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值