Gin实战演练
1 gin的简单使用
package main
import "github.com/gin-gonic/gin"
func main() {
// Default方法的主要作用是实例化一个带有日志、故障恢复中间件的引擎。
r := gin.Default() //实例化一个gin对象
// 定义请求
//定义一个GET请求的路由,参数一是路由地址,也就是在浏览器访问的相对路径,
// 参数二是一个匿名函数,函数内部用于业务逻辑处理。
r.GET("/login", func(c *gin.Context) {
c.JSON(200, gin.H{
//JSON内容可以通过gin提供的H方法来构建,非常方便。
"msg": "login", //调用JSON方法返回数据。JSON的操作非常简单,参数一是状态码,参数二是JSON的内容。
})
})
// Run方法最终会调用内置http库的ListenAndServe方法来监听端口,如果不传参数默认监听80端口,
// 也可以通过参数来变更地址和端口。
r.Run(":12005")
}
2 RESTful API
RESTful 是⽹络应⽤程序的⼀种设计⻛格和开发⽅式,每⼀个URI代表⼀种资源,客户端通过 POST 、 DELETE 、 PUT 、 GET 四种请求⽅式来对资源做增删改查的操作。
同样的,Gin框架给我们提供的除这4种动词外,还有 PATCH 、 OPTION 、 HEAD 等,详细内容可以查看 rentergroup.go
⽂件的IRoutes
接⼝
// IRoutes defines all router handle interface.
type IRoutes interface {
Use(...HandlerFunc) IRoutes
Handle(string, string, ...HandlerFunc) IRoutes
Any(string, ...HandlerFunc) IRoutes
GET(string, ...HandlerFunc) IRoutes
POST(string, ...HandlerFunc) IRoutes
DELETE(string, ...HandlerFunc) IRoutes
PATCH(string, ...HandlerFunc) IRoutes
PUT(string, ...HandlerFunc) IRoutes
OPTIONS(string, ...HandlerFunc) IRoutes
HEAD(string, ...HandlerFunc) IRoutes
StaticFile(string, string) IRoutes
Static(string, string) IRoutes
StaticFS(string, http.FileSystem) IRoutes
}
例如接口:
func main() {
router := gin.Default()
// 请求动词的第一个参数是请求路径,第二个参数是用于逻辑处理的函数
router.POST("/article", func(c *gin.Context) {
c.String(200, "article post")
})
router.DELETE("/article", func(c *gin.Context) {
c.String(200, "article delete")
})
router.GET("/article/:id/:action", func(c *gin.Context) {
id := c.Param("id")
action := c.Param("action")
fmt.Printf("2 /article/:id->%s, action:%s\n", id, action)
c.String(200, id+" "+action)
})
router.Run(":8080")
}
-
通过web访问url
-
使用curl命令来访问url
/ 测试方法 // curl -X PUT http://localhost:8080/article // curl -X POST http://localhost:8080/article // curl -X GET http://localhost:8080/article // curl -X DELETE http://localhost:8080/article
路由参数
:路由
这种匹配模式是精确匹配的,只能匹配⼀个
访问:http://localhost:8080/users/123
输出:123
func main() {
r := gin.Default()
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
})
r.Run(":8080")
}
*路由
还有⼀种不常⽤的就是 * 号类型的参数,表示匹配所有,结果是⼀个 / 开头的路径字符串
访问:http://localhost:8080/users/123
输出:/123
func main() {
r := gin.Default()
r.GET("/users/*id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
})
r.Run(":8080")
}
特别说明⼀点
访问 http://localhost:8080/users时候,会被重定向到 http://localhost:8080/users/,根本原因在于 /users 没有匹配的路由,但是有匹配 /users/ 的路由,所以就会被重定向 到 /users/ ,如下:
func main() {
r := gin.Default()
r.GET("/users/*id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
})
}
禁止重定向
r.RedirectTrailingSlash = false
加上如上设置之后,访问 http://localhost:8080/users,是访问不成功的,因为没有服务器去处理这个url
3 Gin获取查询参数
例如:
http://127.0.0.1:8080/users?k1=v1&k2=v2
以 ? 为起点,后⾯的 k=v&k1=v1&k2=v2 这样的字符串就是查询参数
上述案例中有2个参数键值对,通过&来连接:
k1=v1
k2=v2
可以使用gin框架中的如下接口来获取实际的参数值
// 3-2-url-param.go url参数获取
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.DefaultQuery("id", "0")
value, ok := c.GetQuery("id") // 适合用来判断是否存在该参数
if ok {
fmt.Println("id:", value)
} else {
fmt.Println("id: nil")
}
c.String(200, c.DefaultQuery("wechat", "default baidu_org"))
})
r.Run(":8080")
}
实际GetQuery具体实现:
func (c *Context) GetQuery(key string) (string, bool) {
if values, ok := c.GetQueryArray(key); ok {
return values[0], ok
}
return "", false
}
DefaultQuery的具体实现也是调用GetQuery: