博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang学习笔记之WEB框架(gin)基本使用
阅读量:6828 次
发布时间:2019-06-26

本文共 6815 字,大约阅读时间需要 22 分钟。

gin是Go语言写的一个web框架,API性能超强,运行速度号称较httprouter要快40倍。封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点。

Github地址:
gin的安装:go get github.com/gin-gonic/gin
API
gin.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}

运行程序,在浏览器上访问:

image

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}

运行程序在浏览器上访问:

image
三、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}

运行程序在浏览器上访问:

image
四、分组

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:

image
六、Gin获取普通post参数

我这里是使用RESTClient来模拟的,在Firefox上附加组件

image

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需要添加头字段

image
如下:
image
七、中间件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

image
在终端上你会发现中间件已执行,我们可以在中间件里做验证或者⽇志记录
image
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/

你可能感兴趣的文章
语言和封装那些事
查看>>
postgres 数据备份与恢复
查看>>
Spring学习总结(2)——Spring的常用注解
查看>>
Java基础学习总结(16)——Java制作证书的工具keytool用法总结
查看>>
Docker镜像与容器命令
查看>>
EFCore笔记之查询数据
查看>>
批量动态生成二维码
查看>>
8张图理解Java
查看>>
centos定时备份远程FTP文件
查看>>
oracle 保留小数位
查看>>
eval
查看>>
zabbix监控系统之监控nginx
查看>>
WEB服务之apache优化
查看>>
XtraBackup完全、增量备份及恢复
查看>>
nohup和&的区别
查看>>
Linux如何开启mysql远程连接
查看>>
Exchange 2010,删除系统默认地址列表后, OWA 通讯簿失败问题解决办法
查看>>
linux系统强制踢掉其它登录用户
查看>>
用TestSuite管理Junit单元测试用例
查看>>
WAMP配置
查看>>