文章目录
重定向
服务器内部重定向
中间件
中间件内部的Goroutines
HTTP自定义配置
重定向
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/raw", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently,"http://baidu.com")
})
router.Run(":8080")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
浏览器输入http://127.0.0.1:8080/raw,回车,神奇的跳转到百度界面
服务器内部重定向
我们还可以通过如下的写法来实现
func main() {
router := gin.Default()
router.GET("/test", func(c *gin.Context) {
c.Request.URL.Path = "/test2"
router.HandleContext(c)
})
router.GET("/test2", func(c *gin.Context) {
c.JSON(200, gin.H{"hello": "world"})
})
router.Run(":8080")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
上效果图:
中间件
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.New()
r.Use(Logger())
r.GET("/test", func(c *gin.Context) {
example := c.MustGet("example").(string)
log.Println(example)
})
r.Run(":8080")
}
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
c.Set("example", "12345")
c.Next()
latency := time.Since(t)
log.Print(latency)
status := c.Writer.Status()
log.Println(status)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
浏览器输入http://127.0.0.1:8080/test
log日志如下:
2018/09/21 15:44:24 12345
2018/09/21 15:44:24 131.006µs
2018/09/21 15:44:24 200
1
2
3
中间件内部的Goroutines
在中间件或处理程序中启动新的Goroutine时,不应该使用其中的原始上下文,必须使用只读副本
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.Default()
r.GET("/long_async", func(c *gin.Context) {
// create copy to be used inside the goroutine
cCp := c.Copy()
go func() {
// simulate a long task with time.Sleep(). 5 seconds
time.Sleep(5 * time.Second)
// note that you are using the copied context "cCp", IMPORTANT
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
})
r.GET("/long_sync", func(c *gin.Context) {
// simulate a long task with time.Sleep(). 5 seconds
time.Sleep(5 * time.Second)
// since we are NOT using a goroutine, we do not have to copy the context
log.Println("Done! in path " + c.Request.URL.Path)
})
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
浏览器发起请求,log日志输出
[GIN] 2018/09/21 - 17:40:20 | 200 | 2.451µs | 127.0.0.1 | GET /long_async
2018/09/21 17:40:25 Done! in path /long_async
[GIN] 2018/09/21 - 17:40:36 | 200 | 5.003324304s | 127.0.0.1 | GET /long_sync
2018/09/21 17:40:36 Done! in path /long_sync
1
2
3
4
5
HTTP自定义配置
func main() {
router := gin.Default()
http.ListenAndServe(":8080", router)
}
1
2
3
4
或者
func main() {
router := gin.Default()
s := &http.Server{
Addr: ":8080",
Handler: router,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()
}
————