Gin的应用
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方法(get)绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把request和response都封装到gin.Context的上下文环境。最后是启动路由的Run方法监听端口。当然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。
应用实例
使用Gin创建一个web server,解析提交的Json数据进行处理,最后再将请求参数返回。
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" -X POST '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()使用了goroutine 实现web服务(框架本身实现的),因此queryRequestAndReponse(c)函数中不能再创建goroutine,如果再次创建,返回response可能出错,警告信息:“[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 400”。