Gin的應用

Gin是一個golang的web server微框架,用於搭建一個簡單的web server。golang

Hello World

使用Gin實現Hello world很是簡單,建立一個router,而後使用其Run的方法:web

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方法。json

應用實例

使用Gin建立一個web server,解析提交的Json數據進行處理,最後再將請求參數返回。restful

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") }

  使用以下命令進行請求:session

  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"}}'app

 

注:框架

1. router.POST()使用了goroutine 實現web服務(框架自己實現的),所以queryRequestAndReponse(c)函數中不能再建立goroutine,若是再次建立,返回response可能出錯,警告信息:「[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 400」。curl

相關文章
相關標籤/搜索