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")
}