Go Web 入门与实战系列:高性能 Web 框架 Gin

·  阅读 1277

这是我参与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 服务器

Gin 官方的文档很详细,这里提供一个 /ping 接口,请求响应一个 JSON 对象。

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 端口,响应结果如下:

gin-web.jpg

简单几行代码,就能实现一个 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求索

分类:
后端