Gin是一个golang的web server微框架,用于搭建一个简单的web server。
Hello World
使用Gin实现Hello world
非常简单,创建一个router,然后使用其Run的方法:
import (
"gopkg.in/gin-gonic/gin.v1"
"net/http"
)
func main(){
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
router.Run(":8000")
}
简单几行代码,就能实现一个web服务。使用gin的Default方法创建一个路由handler。然后通过HTTP方法绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把request和response都封装到gin.Context的上下文环境。最后是启动路由的Run方法监听端口。麻雀虽小,五脏俱全。当然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。
应用实例
使用Gin创建一个web server,解析提交数据进行处理,最后再将请求参数返回
type RequestParas struct {
QueryText string `json:"query_text"`
SessionID string `json:"session_id"`
AgentToken string `json:"agent_token"`
}
type RequestBody struct {
Timestamp uint64 `json:"timestamp" binding:"required"`
Sign string `json:"sign" binding:"required"`
Data RequestParas `json:"data" binding:"required"`
}
func queryRequestAndReponse(c *gin.Context) {
var reqBodyJSON RequestBody
//数据解析,将json格式数据解析为结构体
if err := c.ShouldBindJSON(&reqBodyJSON); err == nil {
//数据处理
//返回response
c.JSON(http.StatusOK, gin.H{
"data": gin.H{
"query_text": reqBodyJSON.Data.QueryText,
"session_id": reqBodyJSON.Data.SessionID,
"agent_token":reqBodyJSON.Data.AgentToken,
},
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func main() {
router := gin.Default()
router.POST("/v1/query", func(c *gin.Context) {
queryRequestAndReponse(c) //注1
})
router.Run(":8000")
}
使用命令curl -H "Content-Type:application/json" -XPOST 'http://127.0.0.1:8000/v1/query?version=20170407' -d '{"timestamp":1502879948,"sign": "c70d665cc46dba4b71305172a0f826a2","data":{"query_text":"金卡怎么办理","agent_token":"eeb8ca20-c436-4d33-9bf6-e5571f9fbb1c"}}'提供数据
注:
1. router.POST()中的func(c *gin.Context) {}已经创建goroutine【框架本身实现的】,因此queryRequestAndReponse(c)不需要再创建goroutine,如果再次创建,返回response可能出错,警告信息:“[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 400”。