这是我参与8月更文挑战的第6天,活动详情查看: 8月更文挑战
Web 应用程序是一种可以通过 Web 访问的应用程序,Web 程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。Web 应用对于身处互联网时代的我们来说太普遍。无论哪一种语言,只要它能够开发出与人类交互的软件,它就必然会支持 Web 应用开发。 本系列文章将会介绍 Go Web 的应用与实践。欢迎关注。
Golang 提供的 net/http 库已经很不错了,对于 http 的协议的实现非常好,基于此再造框架,也不会是难事,因此生态中出现了很多框架,如 Gin、gorilla/mux、Echo 等。
Gin Web 框架 Gin 介绍
Gin 是 Golang 的一个微框架,封装比较优雅,API 友好,源码注释比较明确,已经发布了 1.0 版本。具有快速灵活,容错方便等特点。其实对于 Golang 而言,Web 框架的依赖要远比 Python,Java 之类的要小。自身的 net/http 足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。下面我们将具体介绍 Gin 的使用实践。
安装
首先需要安装,比较简单,使用 go get 即可:
```
$ go get -u github.com/gin-gonic/gin
```
复制代码
目前最新的版本是 v1.4。
使用方式
通过引入如下的包:
import (
"github.com/gin-gonic/gin"
"net/http" //可选,当使用 http.StatusOK 这类的常量时需引入
)
复制代码
使用 Gin 实现 HTTP 服务器
/ping
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run(:8000) // 默认监听 0.0.0.0:8080
}
复制代码
我们起了一个 Web 服务器,监听 8000 端口,响应结果如下:
简单几行代码,就能实现一个 Web 服务。使用 gin 的 Default 方法创建一个路由 handler。然后通过 HTTP 方法绑定路由规则和路由函数。不同于 net/http 库的路由函数,gin 进行了封装,把 request 和 response 都封装到 gin.Context 的上下文环境。最后是启动路由的 Run 方法监听端口。麻雀虽小,五脏俱全。当然,除了 GET 方法,gin 也支持 POST、PUT、DELETE、OPTION 等常用的 Restful 方法。
Restful 路由
gin 的路由来自 httprouter 库。因此 httprouter 具有的功能,gin 也具有,不过 gin 不支持路由正则表达式:
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
复制代码
冒号加上一个参数名组成路由参数。可以使用 c.Params 的方法读取其值。当然这个值是字符串类型。诸如 /user/aoho、/user/world 都可以被处理器匹配,而 /user、/user/ 和 /user/aoho/ 不会被匹配。
除了冒号(:),gin还提供了星号(*)处理参数,星号能匹配的规则就更多。
router.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
复制代码
该处理器可以匹配 /user/aoho/,也可以匹配 /user/aoho/send。如果没有其他的路由匹配 /user/aoho,请求也会转发到 /user/aoho/。
Gin 的中间件
中间件的意思就是,对一组接口的统一操作,可以把逻辑提取出来,类似于横切关注点,常用于一些记录 log,错误 handler,还有就是对部分接口的鉴权。
比如有一组 API 接口是用户登入后的操作,我们就需要在进入每个 API 接口前都进行权限的验证。有了中间件后,我们只需要创建一个中间件,权限的验证放到中间件,然后把 这个中间件绑定到那一组 API 上即可。下面就实现一个简易的鉴权中间件。
func AuthMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.Request.Header.Get("Authorization")
authorized := check(token) //调用认证方法
if authorized {
c.Next()
return
}
c.JSON(http.StatusUnauthorized, gin.H{
"error": "Unauthorized",
})
c.Abort()
return
}
}
func main() {
r := gin.Default()
r.GET("/path", AuthMiddleWare(), func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"data": "ok"})
})
}
复制代码
我们定义了一个 AuthMiddleWare 中间件,中间件的功能是提测请求的头部 Authorization,将获取的 token 调用认证方法判断,是否是合法的 token。在处理器中,增加 AuthMiddleWare() 中间件即可。
小结
总的来说,Gin 是一个轻巧而强大的 Golang Web 框架,路由性能高,在各种 Web 框架中处于领先地位。Gin 框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用。
阅读最新文章,关注公众号:aoho求索