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


文章目錄

Gin介紹

安裝

快速開始

路徑參數

構造參數

post傳參

get+post混合形式

構造Map格式

分組路由

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

文章目錄Gin介紹安裝快速開始路徑參數構造參數post傳參get+post混合形式構造Map格式分組路由Gin介紹Gin是一個golang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。借助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規范。
安裝下載安裝
$ go get -u github.com/gin-gonic/gin1項目中導入
import "github.com/gin-gonic/gin"1(可選)導入NET/HTTP。例如,如果使用諸如HTTP.StasuCK之類的常數,則需要這樣做。
import "net/http"1快速開始讓我們先通過一個簡單的例子,迅速的了解以下以下demo代碼摘自Gin的github實例
package mainimport "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()}1234567891011通過$ 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")}
12345678910111213141516瀏覽器會渲染輸出為: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})}123func (c *Context) JSON(code int, obj interface{}) {c.Render(code, render.JSON{Data: obj})}123路徑參數

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)}
123456789101112131415以上函數的路由將會匹配 /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)}1234567891011121314瀏覽器輸入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,})}123456789101112131415161718效果圖如下:

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)}
12345678910111213141516171819效果圖如下:

構造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)}
12345678910111213141516171819202122fmt輸出如下:
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")}12345678910111213141516171819202122232425262728293031323334瀏覽器輸入http://127.0.0.1:8080/v1/read后台log輸出read
瀏覽器輸入http://127.0.0.1:8080/v2/login后台log輸出login————————————————版權聲明:本文為CSDN博主「丙申」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/u013210620/java/article/details/82773905


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM