1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func main() {
  7. // 1.创建路由
  8. r := gin.Default()
  9. // 2.绑定路由规则,执行的函数
  10. // gin.Context,封装了request和response
  11. r.GET("/", func(c *gin.Context) {
  12. c.String(http.StatusOK, "hello World!")
  13. })
  14. // 3.监听端口,默认在8080
  15. // Run("里面不指定端口号默认为8080")
  16. r.Run(":8000")
  17. }

基本路由

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.GET("/", func(c *gin.Context) {
  9. c.String(http.StatusOK, "hello word")
  10. })
  11. r.POST("/xxxpost",getting)
  12. r.PUT("/xxxput")
  13. //监听端口默认为8080
  14. r.Run(":8000")
  15. }

API参数

  1. package main
  2. import (
  3. "net/http"
  4. "strings"
  5. "github.com/gin-gonic/gin"
  6. )
  7. func main() {
  8. r := gin.Default()
  9. r.GET("/user/:name/*action", func(c *gin.Context) {
  10. name := c.Param("name")
  11. action := c.Param("action")
  12. //截取/
  13. action = strings.Trim(action, "/")
  14. c.String(http.StatusOK, name+" is "+action)
  15. })
  16. //默认为监听8080端口
  17. r.Run(":8000")
  18. }

routes group

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "fmt"
  5. )
  6. // gin的helloWorld
  7. func main() {
  8. // 1.创建路由
  9. // 默认使用了2个中间件Logger(), Recovery()
  10. r := gin.Default()
  11. // 路由组1 ,处理GET请求
  12. v1 := r.Group("/v1")
  13. // {} 是书写规范
  14. {
  15. v1.GET("/login", login)
  16. v1.GET("submit", submit)
  17. }
  18. v2 := r.Group("/v2")
  19. {
  20. v2.POST("/login", login)
  21. v2.POST("/submit", submit)
  22. }
  23. r.Run(":8000")
  24. }
  25. func login(c *gin.Context) {
  26. name := c.DefaultQuery("name", "jack")
  27. c.String(200, fmt.Sprintf("hello %s\n", name))
  28. }
  29. func submit(c *gin.Context) {
  30. name := c.DefaultQuery("name", "lily")
  31. c.String(200, fmt.Sprintf("hello %s\n", name))
  32. }

同步异步

  • goroutine机制可以方便地实现异步处理
  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. func main() {
  8. // 1.创建路由
  9. // 默认使用了2个中间件Logger(), Recovery()
  10. r := gin.Default()
  11. // 1.异步
  12. r.GET("/long_async", func(c *gin.Context) {
  13. // 需要搞一个副本
  14. copyContext := c.Copy()
  15. // 异步处理
  16. go func() {
  17. time.Sleep(3 * time.Second)
  18. log.Println("异步执行:" + copyContext.Request.URL.Path)
  19. }()
  20. })
  21. // 2.同步
  22. r.GET("/long_sync", func(c *gin.Context) {
  23. time.Sleep(3 * time.Second)
  24. log.Println("同步执行:" + c.Request.URL.Path)
  25. })
  26. r.Run(":8000")
  27. }

全局中间件

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // 定义中间
  8. func MiddleWare() gin.HandlerFunc {
  9. return func(c *gin.Context) {
  10. t := time.Now()
  11. fmt.Println("中间件开始执行了")
  12. // 设置变量到Context的key中,可以通过Get()取
  13. c.Set("request", "中间件")
  14. status := c.Writer.Status()
  15. fmt.Println("中间件执行完毕", status)
  16. t2 := time.Since(t)
  17. fmt.Println("time:", t2)
  18. }
  19. }
  20. func main() {
  21. // 1.创建路由
  22. // 默认使用了2个中间件Logger(), Recovery()
  23. r := gin.Default()
  24. // 注册中间件
  25. r.Use(MiddleWare())
  26. // {}为了代码规范
  27. {
  28. r.GET("/ce", func(c *gin.Context) {
  29. // 取值
  30. req, _ := c.Get("request")
  31. fmt.Println("request:", req)
  32. // 页面接收
  33. c.JSON(200, gin.H{"request": req})
  34. })
  35. }
  36. r.Run()
  37. }

next方法

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // 定义中间
  8. func MiddleWare() gin.HandlerFunc {
  9. return func(c *gin.Context) {
  10. t := time.Now()
  11. fmt.Println("中间件开始执行了")
  12. // 设置变量到Context的key中,可以通过Get()取
  13. c.Set("request", "中间件")
  14. // 执行函数
  15. c.Next()
  16. // 中间件执行完后续的一些事情
  17. status := c.Writer.Status()
  18. fmt.Println("中间件执行完毕", status)
  19. t2 := time.Since(t)
  20. fmt.Println("time:", t2)
  21. }
  22. }
  23. func main() {
  24. // 1.创建路由
  25. // 默认使用了2个中间件Logger(), Recovery()
  26. r := gin.Default()
  27. // 注册中间件
  28. r.Use(MiddleWare())
  29. // {}为了代码规范
  30. {
  31. r.GET("/ce", func(c *gin.Context) {
  32. // 取值
  33. req, _ := c.Get("request")
  34. fmt.Println("request:", req)
  35. // 页面接收
  36. c.JSON(200, gin.H{"request": req})
  37. })
  38. }
  39. r.Run()
  40. }

局部中间件

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // 定义中间
  8. func MiddleWare() gin.HandlerFunc {
  9. return func(c *gin.Context) {
  10. t := time.Now()
  11. fmt.Println("中间件开始执行了")
  12. // 设置变量到Context的key中,可以通过Get()取
  13. c.Set("request", "中间件")
  14. // 执行函数
  15. c.Next()
  16. // 中间件执行完后续的一些事情
  17. status := c.Writer.Status()
  18. fmt.Println("中间件执行完毕", status)
  19. t2 := time.Since(t)
  20. fmt.Println("time:", t2)
  21. }
  22. }
  23. func main() {
  24. // 1.创建路由
  25. // 默认使用了2个中间件Logger(), Recovery()
  26. r := gin.Default()
  27. //局部中间键使用
  28. r.GET("/ce", MiddleWare(), func(c *gin.Context) {
  29. // 取值
  30. req, _ := c.Get("request")
  31. fmt.Println("request:", req)
  32. // 页面接收
  33. c.JSON(200, gin.H{"request": req})
  34. })
  35. r.Run()
  36. }

中间件练习

  • 定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间,如下:
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // 定义中间
  8. func myTime(c *gin.Context) {
  9. start := time.Now()
  10. c.Next()
  11. // 统计时间
  12. since := time.Since(start)
  13. fmt.Println("程序用时:", since)
  14. }
  15. func main() {
  16. // 1.创建路由
  17. // 默认使用了2个中间件Logger(), Recovery()
  18. r := gin.Default()
  19. // 注册中间件
  20. r.Use(myTime)
  21. // {}为了代码规范
  22. shoppingGroup := r.Group("/shopping")
  23. {
  24. shoppingGroup.GET("/index", shopIndexHandler)
  25. shoppingGroup.GET("/home", shopHomeHandler)
  26. }
  27. r.Run(":8000")
  28. }
  29. func shopIndexHandler(c *gin.Context) {
  30. time.Sleep(5 * time.Second)
  31. }
  32. func shopHomeHandler(c *gin.Context) {
  33. time.Sleep(3 * time.Second)
  34. }

参考

topgoer