使用gin框架 实现web功能还是很方便的
比起net/http 方便简单很多
很重要的一点就是, context.Next() (context 为gin.context) 函数 之前的部分为 主处理逻辑之前执行的部分, Next之后为处理完之后执行的部分 ,理解这一点很重要,,其实也就是先将请求处理一下,框架会自动将处理后的请求发送给主处理代码段。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func middle() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.String(200,"hello\n")
head := c.Request.Header
for k, v := range head {
log.Println(k,":",v)
}
c.Next()
latency := time.Since(start)
log.Printf("This process is use %v from %v\n",latency,start)
}
}
func main() {
gin.DisableConsoleColor()
router := gin.Default()
router.GET("/", gin.BasicAuth(gin.Accounts{
"foo":"bar",
}),middle(),func(c *gin.Context) {
time.Sleep(5*time.Second)
c.JSON(http.StatusOK,gin.H{
"status":"ok",
})
})
err := router.Run(":80")
if err != nil {
fmt.Println(err)
return
}
}
输出的结果
[GIN-debug] Listening and serving HTTP on :80
2019/11/07 22:15:14 Sec-Fetch-Site : [none]
2019/11/07 22:15:14 Sec-Fetch-Mode : [navigate]
2019/11/07 22:15:14 Accept-Encoding : [gzip, deflate, br]
2019/11/07 22:15:14 Authorization : [Basic Zm9vOmJhcg==]
2019/11/07 22:15:14 Upgrade-Insecure-Requests : [1]....省略了一些输出
2019/11/07 22:15:14 Sec-Fetch-User : [?1]
2019/11/07 22:15:14 Accept-Language : [zh-CN,zh;q=0.9,en;q=0.8]
2019/11/07 22:15:14 Connection : [keep-alive]
2019/11/07 22:15:14 User-Agent : [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36]
// 主要看这里 use 5.0259196s 这证明了 ,确实是在处理完主逻辑之后执行的代码。
2019/11/07 22:15:19 This process is use 5.0259196s from 2019-11-07 22:15:14.6182836 +0800 CST m=+10.036132601
[GIN] 2019/11/07 - 22:15:19 | 200 | 5.0259196s | 127.0.0.1 | GET /