青训营笔记2:Gin框架| 青训营

96 阅读5分钟

Gin框架

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。

Gin有以下特性。

  • 快速

    基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能。

  • 支持中间件

    传入的 HTTP 请求可以由一系列中间件和最终操作来处理。 例如:Logger,Authorization,GZIP,最终操作 DB。

  • Crash 处理

    Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic!

  • JSON 验证

    Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。

  • 路由组

    更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。

  • 错误管理

    Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。

  • 内置渲染

    Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。

  • 可扩展性

    新建一个中间件非常简单。

在使用中的要点/遇到的问题

1 基本使用流程

下载并安装Gin

go get -u github.com/gin-gonic/gin

实例代码

package main
​
import (
    "github.com/gin-gonic/gin"
)
​
func main() {
    // 创建一个默认的路由引擎
    r := gin.Default()
    // GET:请求方式;/hello:请求的路径
    // 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
    r.GET("/hello", func(c *gin.Context) {
        // c.JSON:返回JSON格式的数据
        c.JSON(200, gin.H{
            "message": "Hello world!",
        })
    })
    // 启动HTTP服务,默认在0.0.0.0:8080启动服务
    r.Run()
}

首先创建一个默认的路由引擎r,然后再定义RESTful API:GET,POST,DELETE,PUT,分别对应查、增、删、改操作,对于不同的功能,可以在相同的API处规范不同的行为。

在每个RESTful API处,要注意到的第一个问题是,第一个参数的路径必须和客户端请求的路径完全相同才行,postman请求测试的的时候不会出现错误的情况,但当使用前端测试的时候任何的\不同都会导致得不到正确的结果。第二个是第二个参数方法最好放在不同的文件下,便于开发。

最后启动HTTP服务,默认为任何IP都可以访问,端口为8080,需要指定端口需要在Run方法中输入参数":[port]"。

2 静态文件处理

静态文件一般就是我们熟知的html文件等,但在gin中更多地使用的是template模板。

当我们渲染的HTML文件中引用了静态文件时,我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。

由于本次的后端只有API的调用功能,没有渲染前端的需求,就没有对这部分功能的实现。

3 获取前端传入的参数
  1. HTTP请求参数

    • 最常见的方式是通过HTTP请求的URL参数传递参数。这些参数通常附加在URL的查询字符串中。例如:http://example.com/api?param1=value1&m2=value2
    • 在Gin框架中,您可以使用c.Query()方法来获取URL查询参数的值。
  2. 请求体(Request Body)

    • 参数可以作为HTTP请求的正文部分(通常是JSON或表单数据)发送。这适用于POST、PUT等请求方法。
    • 在Gin框架中,您可以使用c.ShouldBind()c.ShouldBindJSON()等方法来绑定请求体中的参数到Go结构体中。
  3. HTTP请求头(HTTP Headers)

    • 参数可以通过HTTP请求头发送。这通常用于包含身份验证令牌或其他元数据。
    • 在Gin框架中,您可以使用c.GetHeader()方法来获取HTTP请求头的值。
  4. Cookie

    • 参数可以存储在HTTP Cookie中,然后由浏览器自动发送到服务器。
    • 在Gin框架中,您可以使用c.GetCookie()方法来获取Cookie的值。
  5. 路径参数(Path Parameters)

    • 参数可以作为URL的一部分,通常用于RESTful API。例如:http://example.com/api/resource/{param}
    • 在Gin框架中,您可以使用路由参数来捕获URL路径中的参数,例如::param
  6. WebSocket消息

    • 对于WebSocket连接,参数可以通过WebSocket消息进行传递。
    • 在Gin框架中,您可以使用Gorilla WebSocket库或其他WebSocket库来处理WebSocket连接和消息。
4 路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。

路由组也是支持嵌套的,通常我们将路由分组用在划分业务逻辑或划分API版本时。

5 中间件

Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

本次的JWT鉴权、etcd的服务发现就放在了中间件中。

Gin中的中间件必须是一个gin.HandlerFunc类型。

在gin框架中,我们可以为每个路由添加任意数量的中间件。