路由余项与中间件
Posted 一纸旧时光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路由余项与中间件相关的知识,希望对你有一定的参考价值。
路由余项
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
)
type person struct {
Name string `form:"name"`
Age int8 `form:"age"`
}
type user struct {
Username string `form:"username" binding:"required"`
Password int8 `form:"passwd" binding:"required"`
}
func main() {
r := gin.New()
r.Static("/img", "./img") // 加载静态资源
// 通用路由方法
r.Handle("GET", "/universal", func(c *gin.Context) {
c.Writer.Write([]byte(c.FullPath())) // 字节数组形式渲染完整路径
})
r.Handle("POST", "/", func(c *gin.Context) {
var p person
var u user
getErr := c.ShouldBindQuery(&p) // 收集GET请求绑定参数
if getErr != nil {
log.Fatal(getErr.Error()) // 日志输出
}
if postErr := c.ShouldBind(&u); postErr != nil {
log.Fatal(postErr.Error())
}
fmt.Println(p.Name, u.Password) // 打印输出
})
r.Run()
}
Q:
gin.Default()
与gin.New()
有什么区别?
A:gin.Default()
在gin.New()
的基础上加入了日志中间件Logger
和异常恢复中间件Recovery
。
Q:
BindJSON()
与ShouldBindJSON()
有什么区别?
A:解析错误时,BindJSON()
会往响应体头部写入 400 状态码。
上传文件
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
file, _ := c.FormFile("file") // 读取表单参数
c.SaveUploadedFile(file, file.Filename) // 保存文件
c.String(http.StatusOK, "%s", file.Filename)
})
r.POST("/multiUpload", func(c *gin.Context) {
form, _ := c.MultipartForm() // 批量上传
files := form.File["files[]"]
for _, file := range files {
log.Println(file.Filename)
}
})
}
user@Debian:~$ curl -g "http://localhost:8080/upload" -X POST -F "file=@pic.png" -H "multipart/form-data" # -F是上传二进制文件,-H是添加标头
中间件
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
// 中间件
func reqInfo() gin.HandlerFunc {
return func(c *gin.Context) {
path := c.FullPath()
method := c.Request.Method
fmt.Println("请求Path:", path)
c.Next() // Next执行业务逻辑代码
fmt.Println("请求Method:", method)
}
}
func main() {
r := gin.Default()
r.Use(reqInfo()) // 插入中间件
r.GET("/middleware", func(c *gin.Context) {
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
})
})
r.Run()
}
- END -
以上是关于路由余项与中间件的主要内容,如果未能解决你的问题,请参考以下文章