基本路由

gin框架中采用的路由库是基于httprouter做的(?)
地址:https://github.com/julienschmidt/httprouter

参数

API参数

可以通过Context的Param方法来获取API参数

  1. package main
  2. import (
  3. r := gin.Default()
  4. r.GET("/user/:name/*action", func(c *gin.Context) {
  5. name := c.Param("name")
  6. action := c.Param("action")
  7. // 截取
  8. action = string.Trim(action, "/")
  9. c.String(name + " is " + action)
  10. })
  11. r.Run()
  12. )

URL参数

URL参数可以通过DefaultQuery()或Query()方法获取
DefaultQuery():若参数不存在则返回默认值
Query():若参数不存在则返回空串

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-goinc/gin
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.GET("/", func(c *gin.Context) {
  9. // 指定默认值
  10. name := c.DefaultQuery("name", "大大神")
  11. c.String(fmt.Sprintf("hello %s", name))
  12. })
  13. r.Run()
  14. }

表单参数

表单传输为post请求,常见有四种

  • application/json
  • application/x-www-form-urlencoded
  • application/xml
  • multipart/form-data

表单参数可以通过DefaultPostForm()或PostForm()方法获取,该方法默认解析x-www-form-urlencoded或form-data格式的参数。
DefaultPostForm():若参数不存在则返回默认值
PostForm():若参数不存在则返回空串

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-goinc/gin
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.POST("/form", func(c *gin.Context) {
  9. types := c.DefaultPostForm("type", "post")
  10. username := c.PostForm("username")
  11. password := c.PostForm("password")
  12. c.String(fmt.Sprintf("username: %s, password: %s, type: %s", username, password, type))
  13. })
  14. r.Run()
  15. }

上传单个文件

multipart/form-data格式用于文件上传
gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中

  1. package main
  2. import (
  3. "github.com/gin-goinc/gin"
  4. )
  5. func main() {
  6. r := gin.Default()
  7. r.POST("/upload", func(c *gin.Context) {
  8. file, err := r.FormFile("file")
  9. if err != nil {
  10. c.String(500, "上传文件出错")
  11. }
  12. c.SaveUploadedFile(file, file.Filename)
  13. c.String(file.Filename)
  14. })
  15. r.Run()
  16. }

上传多个文件

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/gin-goinc/gin"
  6. )
  7. func main() {
  8. r := gin.Default()
  9. // 限制表单上传大小8M,默认为32M
  10. r.MaxMultipartMemory = 8 << 20
  11. r.POST("/upload", func(c *gin.Context) {
  12. files, err := r.FormFile("files")
  13. if err != nil {
  14. c.String(http.StatusBadRequest, fmt.Sprintf("get error %s", err.Error()))
  15. }
  16. // 遍历所有图片
  17. for _, file := range files {
  18. if err := c.SaveUploadedFile(file, file.Filename); err != nil {
  19. c.String(http.StatusBadRequest, fmt.Sprintf("upload err %s", err.Error()))
  20. return
  21. }
  22. }
  23. c.String(http.StatusOK, fmt.Sprintf("uploaded %d files", len(files)))
  24. })
  25. r.Run()
  26. }

路由组

routes group是为了管理一些相同的url

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-goinc/gin"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. v1 := r.Group("/v1")
  9. {
  10. v1.GET("/login", login)
  11. }
  12. v2 := r.Group("/v2")
  13. {
  14. v2.POST("/login", login)
  15. v2.POST("/submit", submit)
  16. }
  17. r.Run()
  18. }
  19. func login(c *gin.Context) {
  20. name := DefaultQuery("name", "Unknown")
  21. c.String(200, fmt.Sprintf("hello %s", name))
  22. }
  23. func submit() {
  24. name := c.DefaultPostForm("name", "Batman")
  25. c.String(201, fmt.Spintf("hello %s", name))
  26. }