1. 程式人生 > >golangWeb框架---github.com/gin-gonic/gin學習一(路由、多級路由、引數傳遞幾種形式)

golangWeb框架---github.com/gin-gonic/gin學習一(路由、多級路由、引數傳遞幾種形式)

golangWeb框架---github.com/gin-gonic/gin學習一(路由、多級路由、引數傳遞幾種形式)

2018年09月19日 20:46:01 Saflyer 閱讀數:413更多

所屬專欄: gin/pg(golang)

 

文章目錄

 

Gin介紹

Gin是一個golang的微框架,封裝比較優雅,API友好,原始碼註釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,效能也非常不錯。框架更像是一些常用函式或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。

安裝

下載安裝

$ go get -u github.com/gin-gonic/gin
  • 1

專案中匯入

import "github.com/gin-gonic/gin"
  • 1

(可選)匯入NET/HTTP。例如,如果使用諸如HTTP.StasuCK之類的常數,則需要這樣做。

import "net/http"
  • 1

快速開始

讓我們先通過一個簡單的例子,迅速的瞭解以下
以下demo程式碼摘自Gin的github例項

package main
import "github.com/gin-gonic/gin"
func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通過$ go run quick.go 啟動
然後瀏覽器輸入http://0.0.0.0:8080/ping
瀏覽器會渲染輸出為:{"message":"pong"}
在這裡插入圖片描述

當然我們還可以利用如下的方式,渲染瀏覽器頁面輸出字串

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main() {
	router := gin.Default()

	router.GET("/someGet", getting)
	router.Run()
}
func getting(c *gin.Context){
	c.String(http.StatusOK,"Hello gin")
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

瀏覽器會渲染輸出為:Hello gin

我們點開原始碼發現,不管是渲染輸出json格式、還是簡單的字串都是呼叫了c.Render方法,以下只是列出了2種,還有其他的諸如HTML、IndentedJSON、SecureJSON、JSONP、AsciiJSON、XML、YAML、ProtoBuf等

func (c *Context) String(code int, format string, values ...interface{}) {
	c.Render(code, render.String{Format: format, Data: values})
}
  • 1
  • 2
  • 3
func (c *Context) JSON(code int, obj interface{}) {
	c.Render(code, render.JSON{Data: obj})
}
  • 1
  • 2
  • 3

路徑引數



func main() {
	router := gin.Default()

	router.GET("/someGet/:name", getting)
	router.Run()
}


func getting(c *gin.Context){
	name:=c.Param("name")
	c.String(http.StatusOK,"Hello%s",name)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

以上函式的路由將會匹配 /user/john格式,但是不回匹配 /user/ 或者 /user
所以我們瀏覽器輸入http://0.0.0.0:8080/someGet/aaaa可以
http://0.0.0.0:8080/someGet/或者http://0.0.0.0:8080/someGet都報錯誤

以上是一個引數,我們還可以定義多級引數,例如下面的例子:

以上的路由函式可以匹配 /user/john/ 或者 /user/john/send
但是不會匹配 /user/john, 報異常
例如瀏覽器輸入http://0.0.0.0:8080/someGet/aaaa/,頁面輸出Helloaaaa-/
例如瀏覽器輸入http://0.0.0.0:8080/someGet/aaaa/gg,頁面輸出Helloaaaa-/gg
例如瀏覽器輸入http://0.0.0.0:8080/someGet/aaaa/gg/cc,頁面輸出Helloaaaa-/gg/cc
但是瀏覽器輸入http://0.0.0.0:8080/someGet/aaaa,報異常404 page not found

構造引數

我們除了可以獲取路徑引數,還可以獲取構造的引數,我們看下面的例子


func main() {
	router := gin.Default()

	router.GET("/someGet", getting)
	router.Run()
}

func getting(c *gin.Context){
	firstname := c.DefaultQuery("firstname", "Guest")
	lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")

	c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

瀏覽器輸入http://0.0.0.0:8080/someGet?firstname=wyf&lastname=123
渲染頁面輸出為Hello wyf 123

瀏覽器輸入http://0.0.0.0:8080/someGet?lastname=123,渲染頁面輸出為Hello Guest 123

post傳參

這裡為利用了postman進行演示操作

func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){
	message := c.PostForm("message")
	nick := c.DefaultPostForm("nick", "anonymous")

	c.JSON(200, gin.H{
		"status":  "posted",
		"message": message,
		"nick":    nick,
	})
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

效果圖如下:
在這裡插入圖片描述

get+post混合形式


func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){

	id := c.Query("id")
	page := c.DefaultQuery("page", "0")
	name := c.PostForm("name")
	message := c.PostForm("message")

	c.String(http.StatusOK,"id: %s; page: %s; name: %s; message: %s", id, page, name, message)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

效果圖如下:
在這裡插入圖片描述

構造Map格式

這樣的格式以前我還沒見過,感覺挺新鮮的,看下程式碼



func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){
	ids := c.QueryMap("ids")
	names := c.PostFormMap("names")

	fmt.Printf("ids: %v; names: %v", ids, names)
	c.JSON(200,gin.H{
		"ids":ids,
		"names":names,
	})
	c.String(http.StatusOK,"ids: %v; names: %v",  ids, names)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

fmt輸出如下:

ids: map[b:hello a:1234]; names: map[first:thinkerou second:tianou]
  • 1

效果圖如下:
在這裡插入圖片描述

分組路由

我們還可以進行路由分組設定,看下面的例子

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)



func main() {
	router := gin.Default()

	v1 := router.Group("/v1")
	{
		v1.GET("/read", readEndpoint)
	}

	v2 := router.Group("/v2")
	{
		v2.GET("/login", loginEndpoint)
	}

	router.Run(":8080")
}

func readEndpoint(c *gin.Context)  {
	fmt.Println("read")


}

func loginEndpoint(c *gin.Context)  {
	fmt.Println("login")
}
  • 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

瀏覽器輸入http://127.0.0.1:8080/v1/read
後臺log輸出read

瀏覽器輸入http://127.0.0.1:8080/v2/login
後臺log輸出login