本文共 6815 字,大约阅读时间需要 22 分钟。
gin是Go语言写的一个web框架,API性能超强,运行速度号称较httprouter要快40倍。封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点。
Github地址:gin的安装:go get github.com/gin-gonic/ginAPIgin.Default()创建路由gin.DisableConsoleColor()禁用控制台颜色gin.SetMode()设置gin模式。参数可以传递:gin.DebugMode、gin.ReleaseMode、gin.TestMode。路由的方法为:假定我们先创建一个路由router := gin.Default()获取的方式可以为1router.GET("/someGet", getting)2 router.POST("/somePost", posting)3 router.PUT("/somePut", putting)4 router.DELETE("/someDelete", deleting)5 router.PATCH("/somePatch", patching)6 router.HEAD("/someHead", head)7 router.OPTIONS("/someOptions", options)
router.Group(s string)
分组,s为组名一、第一个gin程序
官方给的一个示例程序1package main 2import "github.com/gin-gonic/gin" 3func main() { 4 r := gin.Default() 5 r.GET("/ping", func(c *gin.Context) { 6 c.JSON(200, gin.H{ 7 "message": "pong", 8 }) 9 })10 r.Run(":8080") // listen and serve on 0.0.0.0:808011}
运行程序,在浏览器上访问:
c.String用来返回字符串。
c.JSON用来返回Json。gin的功能不只是简单输出Json数据。它是一个轻量级的WEB框架,支持RestFull风格API,支持GET,POST,PUT,PATCH,DELETE,OPTIONS 等http方法,支持文件上传,分组路由,Multipart/Urlencoded FORM,以及支持JsonP,参数处理等等功能,这些都和WEB紧密相关,通过提供这些功能,使开发人员更方便地处理WEB业务。不同于 net/http库的路由函数,gin进行了封装,把request和response都封装到 gin.Context的上下文环境。
二、快速匹配参数
Gin框架可以快速的匹配参数1func main() { 2 router := gin.Default() 3 router.GET("/user/:name/:password", HinHandler) 4 router.Run(":8081") 5} 6//HinHandler 解构传过来的name和password 7func HinHandler(c *gin.Context) { 8 name := c.Param("name") 9 pwd := c.Param("password")10 //内部提供方法用来返回字符串11 c.String(http.StatusOK, "你好 %s,你的密码为%s", name, pwd)12}
运行程序在浏览器上访问:
三、Gin获取普通get参数1func main() { 2 //修改模式 3 gin.SetMode(gin.ReleaseMode) 4 //Default方法创建一个路由handler。 5 router := gin.Default() 6 router.GET("/user", GetHandler) 7 router.Run(":8081") 8} 9//GetHandler 使用get方式获取对应键的值10func GetHandler(c *gin.Context) {11 name := c.DefaultQuery("name", "Guest") //找不到name给它一个默认值Guest12 password := c.Query("password") //找不到直接赋空13 //GetQuery返回两个参数,第一个是找到的对应键的值,第二个是是否找到error类型14 id, exist := c.GetQuery("id")15 if !exist {16 name = "the key is not exist"17 }18 c.Data(http.StatusOK, "text/plain",19 []byte(fmt.Sprintf("get success! %s %s %s", name, password, id)))20}
运行程序在浏览器上访问:
四、分组1//分组 2 //组内成员访问为http://127.0.0.1:8080/admin/... 3 v1 := router.Group("admin") 4 5 { 6 //访问为http://127.0.0.1:8080/admin/ping 7 v1.GET("/ping", api.HelloPage) 8 v1.GET("/welcome", api.LoginHandler) 9 v1.GET("/getquery",api.GetHandler)10 }
五、Gin默认路由
我们可以自定义404错误
1func main() { 2 //修改模式 3 gin.SetMode(gin.ReleaseMode) 4 5 //Default方法创建一个路由handler。 6 router := gin.Default() 7 8 //设定请求url不存在的返回值 9 router.NoRoute(NoResponse)1011 router.GET("/user", GetHandler)12 router.Run(":8081")13}14//NoResponse 请求的url不存在,返回40415func NoResponse(c *gin.Context) {16 //返回404状态码17 c.JSON(http.StatusNotFound, gin.H{18 "status": 404,19 "error": "404, page not exists!",20 })21}22//GetHandler 使用get方式获取对应键的值23func GetHandler(c *gin.Context) {24 name := c.DefaultQuery("name", "Guest") //找不到name给它一个默认值Guest25 password := c.Query("password") //找不到直接赋空26 //GetQuery返回两个参数,第一个是找到的对应键的值,第二个是是否找到error类型27 id, exist := c.GetQuery("id")28 if !exist {29 name = "the key is not exist"30 }31 c.Data(http.StatusOK, "text/plain",32 []byte(fmt.Sprintf("get success! %s %s %s", name, password, id)))33}
我们去请求一个并不存在的url:
六、Gin获取普通post参数我这里是使用RESTClient来模拟的,在Firefox上附加组件
1func main() { 2 //修改模式 3 gin.SetMode(gin.ReleaseMode) 4 5 //Default方法创建一个路由handler。 6 router := gin.Default() 7 8 //设定请求url不存在的返回值 9 router.NoRoute(NoResponse)1011 router.POST("/user", PostLoginHandler)12 router.Run(":8081")13}1415//NoResponse 请求的url不存在,返回40416func NoResponse(c *gin.Context) {17 //返回404状态码18 c.JSON(http.StatusNotFound, gin.H{19 "status": 404,20 "error": "404, page not exists!",21 })22}2324//PostLoginHandler 获取参数25func PostLoginHandler(c *gin.Context) {26 name := c.PostForm("name") //找不到name直接返回0值27 password := c.DefaultPostForm("password", "888") //找不到password赋默认值28 sec, ok := c.GetPostForm("second") //判断是否能找到,找不到返回false29 c.String(http.StatusOK, "hello %s %s %s", name, password, sec)30 log.Panicln(ok)31}
使用post需要添加头字段
如下:七、中间件MiddleWare注意,gin.Default() 默认是加载了一些框架内置的中间件的,而 gin.New() 则没有,根据需要自己手动加载中间件。1func MiddleWare(c *gin.Context) { 2 fmt.Println("before request") 3 c.Next() 4} 5func main() { 6 //修改模式 7 gin.SetMode(gin.ReleaseMode) 8 9 //Default方法创建一个路由handler。10 router := gin.Default()1112 //设定请求url不存在的返回值13 router.NoRoute(NoResponse)1415 router.Use(MiddleWare)1617 router.GET("/user", GetHandler)18 router.Run(":8081")19}2021//NoResponse 请求的url不存在,返回40422func NoResponse(c *gin.Context) {23 //返回404状态码24 c.JSON(http.StatusNotFound, gin.H{25 "status": 404,26 "error": "404, page not exists!",27 })28}2930//GetHandler 使用get方式获取对应键的值31func GetHandler(c *gin.Context) {32 name := c.DefaultQuery("name", "Guest") //找不到name给它一个默认值Guest33 password := c.Query("password") //找不到直接赋空34 //GetQuery返回两个参数,第一个是找到的对应键的值,第二个是是否找到error类型35 id, exist := c.GetQuery("id")36 if !exist {37 name = "the key is not exist"38 }39 c.Data(http.StatusOK, "text/plain",40 []byte(fmt.Sprintf("get success! %s %s %s", name, password, id)))41}
我们访问上面的url
在终端上你会发现中间件已执行,我们可以在中间件里做验证或者⽇志记录c.Next()继续执行下面的函数c.Abort()截断执行八、文件服务
上传单个文件1func main() { 2 router := gin.Default() 3 // Set a lower memory limit for multipart forms (default is 32 MiB) 4 // router.MaxMultipartMemory = 8 << 20 // 8 MiB 5 router.POST("/upload", func(c *gin.Context) { 6 // single file 7 file, _ := c.FormFile("file") 8 log.Println(file.Filename) 910 // Upload the file to specific dst.11 // c.SaveUploadedFile(file, dst)1213 c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))14 })15 router.Run(":8080")16}
上传多个文件
1func main() { 2 router := gin.Default() 3 // Set a lower memory limit for multipart forms (default is 32 MiB) 4 // router.MaxMultipartMemory = 8 << 20 // 8 MiB 5 router.POST("/upload", func(c *gin.Context) { 6 // Multipart form 7 form, _ := c.MultipartForm() 8 files := form.File["upload[]"] 9 for _, file := range files {10 log.Println(file.Filename)1112 // Upload the file to specific dst.13 // c.SaveUploadedFile(file, dst)14 }15 c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))16 })17 router.Run(":8080")18}
原文发布时间为:2018-12-24
本文作者: Golang语言社区本文来自云栖社区合作伙伴“”,了解相关信息可以关注“Golangweb”微信公众号转载地址:http://tlykl.baihongyu.com/