路由余项与中间件

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 -


以上是关于路由余项与中间件的主要内容,如果未能解决你的问题,请参考以下文章

插值与拟合

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

单手也能创奇迹!独臂博士单手敲代码获奖 30 余项:感恩所有的善意

单手也能创奇迹!独臂博士单手敲代码获奖 30 余项:感恩所有的善意