gin框架路由的基本应用

572 阅读2分钟

1、基本路由

前端请求到达后端如何被处理,这就需要进行路由去匹配相应的handler方法执行了,gin框架中采用的路由库是基于httprouter做的。

package main

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

func main() {
	//创建路由
    r := gin.Default()
    //绑定路由规则,执行函数
    //gin.Context,封装了request和response
    r.GET("/", func(c *gin.Context) {
        c.String(200, "hello word")
    }) 
    //监听端口默认为8080
    r.Run(":8000")
}

2、Restful风格的Api

gin支持Restful风格的Api,即URL定位资源,用HTTP描述操作。

1.查询 /user/getXxx Get user/Xxx

2.添加 /user/addXxx POST user/Xxx

3.修改 /user/updateXxx PUT user/Xxx

4.删除 /user/delXxxx DELETE user/Xxx

3、Api参数

可以通过Context的Param方法来获取Api参数。

冒号加上一个参数名组成一个路由参数,可以使用c.Prarams的方法读取其值,当然这个值是字符串string。

星号*能匹配的规则更多。

package main

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

//路由
func main() {
	r := gin.Default()
    
	r.GET("/:name/*age", func(c *gin.Context) {
		name := c.Param("name")
		age := c.Param("age")
		age = strings.Trim(age, "/")
		c.String(200, name + " age is " + age)
	}) 
    
    r.Run(":8080")
}

输出结果

4、Url参数

url参数可以通过DefaultQuery()Query()方法获取。

DefaultQuery()若参数不存在,返回默认值,Query()若不存在,返回空字符串。

query string 即路由用 ?以后连接的key1=value1&key2=value2的形式的参数,当然这个key-value是经过urlencode编码。

package main

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

//路由
func main() {
	r := gin.Default()
	r.GET("/user", func(c *gin.Context) {
		name := c.DefaultQuery("name", "test")
		age := c.Query("age")
		c.String(200, name + " age is " + age)
	})
	r.Run(":8080")
}

浏览器访问http://127.0.0.1:8080/user?name=xiaoming&age=18 输出结果:

5、表单参数

表单传输为post请求,http常见的传输格式为四种:

  • application/json
  • application/x-www-form-urlencoded
  • application/xml
  • mulipart/form-data

表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或form-data格式的参数

package main

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

//路由
func main() {
	r := gin.Default()
	r.POST("/form", func(c *gin.Context) {
		name := c.DefaultPostForm("name", "test")
		age := c.PostForm("age")
		c.String(200, name + " age is " + age)
	})
	r.Run(":8080")
}

6、路由组

路由组是为了管理一些相同的url

package main

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

//路由
func main() {
	r := gin.Default()
	//路由组1, 处理GET请求
	v1 := r.Group("/v1")
	{
		v1.GET("/", Index)
		v1.GET("/test", Test)
	}
	//路由组2,处理Post请求
	v2 := r.Group("/v2")
	{
		v2.POST("/login", Login)
		v2.POST("/submit", Submit)
	}
    r.Run(":8080")
}

路由组也是支持嵌套的,例如:

v1 := r.Group("/v1")
{
    v1.GET("/", Index)
    v1.GET("/test", Test)
    
    //路由嵌套
    xx := v1.Group("xx")
    xx.GET("/xxx", XXXX)
}

7、重定向

package main

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

//路由
func main() {
	r := gin.Default()
	/*
	 * 301:永久重定向
	 * 302:临时重定向
	*/
	r.GET("/index", func(c *gin.Context) {
		c.Redirect(301, "https://www.baidu.com")
	})

	//路由重定向
	r.GET("/a", func(c *gin.Context) {
		c.Request.URL.Path = "/b"
		r.HandleContext(c)
	})
	r.GET("/b", func(c *gin.Context) {
		c.String(200, "Hello World")
	})
	r.Run(":8080")
}

本文正在参加技术专题18期-聊聊Go语言框架