首页>>后端>>Golang->gin框架原理详解(gin框架是什么)

gin框架原理详解(gin框架是什么)

时间:2023-12-12 本站 点击:2

Gin 的启动过程、路由及上下文源码解读

Engine 是 gin 框架的一个实例,它包含了多路复用器、中间件和配置中心。

gin 通过 Engine.Run(addr ...string) 来启动服务,最终调用的是 http.ListenAndServe(address, engine) ,其中第二个参数应当是一个 Handler 接口的实现,即 engine 实现了此接口:

Engine.ServeHTTP() 会先初始化一个空的上下文,然后挂上请求 c.Reuqest = req ,随后执行 engine.handlerHTTPRequest(c) (包含主要处理逻辑的函数)。

以上就是正常处理一个请求的主要逻辑,其他的就现阶段来说先忽略了。

Engine 组合了 RouterGroup。

RouterGroup 实现了 IRouter 接口,IRouter 接口是 IRoutes 接口和 Group 函数组合而成。

RouterGroup 的结构体只有四个属性:

当新建 Engine 时,会初始化一个 RouterGroup 结构,RouterGroup 是组合在 Engine 中的(所以 Engine 可以调用 RouterGroup 的所有方法),同时 Engine 的引用也记录在了 RouterGroup 上。

如上,RouterGroup 实现了 IRouter 接口,下面是一些方法的实现。

gin 通过上方 RouterGroup 暴露的几个方法添加路由,底层使用的方法是 Engine.addRoute(method, path string, handlers HandlerChain) 。

Engine.trees 属性是存储所有路由信息的总入口。它是一个切片,其中每个元素对应一种 method 并且是一个多叉树的根节点。

当 addRoute 时,先根据 method 找到对应的 tree (Engine.trees[i])。然后会比较 加入者 的 path 和 node 中的 path 相似的部分, 相似的部分 作为 父结点,不同的部分作为 子结点。以 多叉树 的方式存储下来。

这里会把 URL 中的路由变量也当作字符串存入树中,因为相同 URL 他们的变量也是一样的。

当请求进来时,因为信枣 Engine 实现了 Handler 接口,所拍银以最后会调用到 Engine.ServeHTTP 内。

找路径在

root.getValue() 比较复杂,这里就不多解释了。

gin@v1.7.7 context.go

Context 中定义了一些属性和方法,用于扩展一些功能。

可以看到,这些方法主要用来获取 gin 自身 Context 的一些信息。

Context 中保存了所有 handlers 列表,存在 Context.handlers 数组中,并用下标 Context.index 标记当前执行的位置。

当主袭坦宴动取消调用链时,会将 index 设置成一个最大值 63( math.MaxInt8 / 2 ),也即调用链最大支持 64 个函数。

Context 中还提供了其他一些函数,当取消调用链的时候,可以设置请求返回的状态码和返回数据信息等。

Context 中的 httpWriter 整理一下。

gin 在 Context 中定义了错误信息字段 Context.Errors 切片,可以链式存储错误信息。

Go 原生的 Context 是通过 ValueContext 来存储元数据信息的,每个 ValueContext 只能存储一对信息,存储多个信息对需要将许多 ValueContext 组成链条,读写很不高效。

gin 的 Context 中存的元数据数据是存在 Context.Keys map[string]interface{} 属性中的,比起原生的 Context 使用起来会更高效。

是指用在 URL 路径中设置的参数,如 /user/:id 的 id 参数。

存储在 Context.Params 属性中,其本质是一个切片,每一个元素是一个 K/V 元组。

因此,在 URL 中是可以使用重复的变量名的(如 /test/:id/case/:id ),但获取值就需要自己从属性中获取了(如: c.Params[0] )。

Query 类是用在 URL 后的参数部分(如: ?id=1 )。

gin 通过 Context.queryCache 属性存储 query 参数,在调用获取 Query 参数时以懒加载的方式初始化: c.queryCache = c.Request.URL.Query() 。

需要注意的是它也支持传入 map 和 array,map 的传入需要像这样 ?m[k1]=v1m[k2]=v2 ,array 的传入像这样 ?a=1a=2 。

包含 PostForm、FormFile、MultipartForm 等。

先略

gin 为方便使用,通过绑定引擎设置了自动绑定用户输入和结构数据的方法。

这里包含设置状态码、设置响应头以及等信息。

只说一些值得注意的

这些方法除了 .Value() 方法外,其他都是返回的默认空值,略。

golang-gin框架参数解析

g.GetHeader("token")

g.Request.Header.Get("判销token")

h := HeaderParam{} 

g.ShouldBindHeader(h)           //使用结构体可以解析,map无效

如:测试

g.DefaultQuery("test","")

g.Query("test")

g.Request.URL.Query().Get("test")

//text类型参数

formP,ok := g.GetPostForm("test")

formP := g.DefaultPostForm("test","")

formP :=g.Request.PostForm.Get("test")

//file类型

file,err := r.FormFile("file")    //单个

//多个formData解析

formDatas,err := r.MultipartForm()

if err !=nil formDatas !=nil {

files := formDatas.File["files"]

textParams := formDatas.Value["params"]

}

数据解析,同一个参数,只可调用一李昌次,不然会EOF

1、定义结构体解析掘扰游

uploadInfo :=model.UploadInfo{}

err := c.ShouldBindJSON(uploadInfo)

2、可用map解析出来后再遍历

uploadInfo := make(map[string]interface{})

err := c.ShouldBindJSON(uploadInfo)

go语言的webengine叫什么

Java教程

Linux入门

更多

首页

Go语言WEB框架(Gin)详解

在 Go语言开发的 Web 框架中,有两款著名 Web 框架分别是 Martini 和 Gin,两款毕悔颤 Web 框架相比较的话,Gin 自己说它比 Martini 要强很多。

Gin 是 Go语言写的一个 web 框架,它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json。总之在 Go语言开发领域是一款值得好好研究的 Web 框架,开源网址:

首先下载安装 gin 包:

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

一个简单的例子:

package main

import "github.com/gin-gonic/gin"

func main() {

//Default返回一个默认的路由引擎

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {

//输出json结果给调用方

c.JSON(200, gin.H{

"message": "pong",

})

})

r.Run() // listen and serve on 0.0.0.0:8080

}

编译运行程序,打开浏览器,访问页面显示:

{"message":"pong"}

gin 的功能不只是简单输出 Json 数据。它是一个轻量级的 WEB 框架,支持 RestFull 风格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上传,分组路由,Multipart/Urlencoded FORM,以及支持 JsonP,参数前念处理等等功能,这些都和 WEB 紧密相关,通过提供这些功能,使开发人员更方便地处理 WEB 业务。

Gin 实际应用

接下来使用 Gin 作为框架来搭建一个拥有静态资源站点,动态 WEB 站点,以及 RESTFull API 接口站点(可专门作为手机 APP 应用提供服务使用)组成的,亦可根据情况分拆这套系统,每种功能独立出来单独提供服务。

下面按照一套系统但采用分站点来说明,首先是整个系统的目录结构,website 目录下面 static 是资源类文件,为静态资源站点专用;photo 目录是 UGC 上传图片目录,tpl 是动态站点的模板。

当然这个目录结构是一种约定,可以根据情况来修改。整个项目已经开源,可以访问来详细了解:具体每个站点的功能怎么实现呢?请看下面有关每个功能的讲述:

静态资源站点

一般网站开发中,我们会考虑把 js,css,以及资源图片放在一起,作为静态站点部署在 CDN,提升响应速度。采用 Gin 实现起来非常简单,当然也可以使用 net/http 包轻松实现,但使用 Gin 会更方便。

不管怎么样,使用 Go 开发,我们可以不用花太多时间在 WEB 服务环境搭建上,程序启动就直接可以提供 WEB 服务了。

package main

import (

"net/http"

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

// 静态资源加载,本例为css,js以及资源图片

router.StaticFS("/public", http.Dir("D:/goproject/src/github.com/ffhelicopter/tmm/website/static"))

router.StaticFile("/favicon.ico", "./resources/favicon.ico")

// Listen and serve on 0.0.0.0:80

router.Run(":80")

}

首先需要是生成一个 Engine,这是 gin 的核心,默认带有 Logger 和 Recovery 两个中间件。

router := gin.Default()

StaticFile 是加载单个文件,而 StaticFS 是加载一个完整的目录资源:

func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes

func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes

这些目录下资源是可以随时更新,而不用重新启动程序。现在编译运行程序,静态站点就可以正常访问了。

GoLang -- Gin框架

• 何为框架:

框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了。成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个。

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等基塌敏特点。其实对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

(1)首先需要安装,安装比较简单,使用go get即可

go get github.com/gin-gonic/gin

如果安装失败,直接去Github clone下来,放置到对应的目录即可。

(2)代码中使用:

下面是一个使用Gin的简单例子:

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",

})

})

router.Run(":8080") // listen and serve on 0.0.0.0:8080

}

简单几行代码,就能实现一个web服务。使用gin的Default方法创建一个路由handler。然后通过HTTP方法绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把request和搏枝response都封装到gin.Context的上下文环境。最后是启动路由的Run方法监听端口。麻雀虽小,五脏俱全。当然,除了GET方法,gin也衫前支持POST,PUT,DELETE,OPTION等常用的restful方法。

Gin可以很方便的支持各种HTTP请求方法以及返回各种类型的数据,详情可以前往查看。

2.1 匹配参数

我们可以使用Gin框架快速的匹配参数,如下代码所示:

冒号:加上一个参数名组成路由参数。可以使用c.Param的方法读取其值。当然这个值是字串string。诸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不会被匹配。

浏览器输入以下测试:

返回结果为:

其中c.String是gin.Context下提供的方法,用来返回字符串。

其中c.Json是gin.Context下提供的方法,用来返回Json。

下面我们使用以下gin提供的Group函数,方便的为不同的API进行分类。

我们创建了一个gin的默认路由,并为其分配了一个组 v1,监听hello请求并将其路由到视图函数HelloPage,最后绑定到 0.0.0.0:8000

C.JSON是Gin实现的返回json数据的内置方法,包含了2个参数,状态码和返回的内容。http.StatusOK代表返回状态码为200,正文为{"message": “welcome"}。

注:Gin还包含更多的返回方法如c.String, c.HTML, c.XML等,请自行了解。可以方便的返回HTML数据

我们在之前的组v1路由下新定义一个路由:

下面我们访问

可以看到,通过c.Param(“key”)方法,Gin成功捕获了url请求路径中的参数。同理,gin也可以捕获常规参数,如下代码所示:

在浏览器输入以下代码:

通过c.Query(“key”)可以成功接收到url参数,c.DefaultQuery在参数不存在的情况下,会由其默认值代替。

我们还可以为Gin定义一些默认路由:

这时候,我们访问一个不存在的页面:

返回如下所示:

下面我们测试在Gin里面使用Post

在测试端输入:

附带发送的数据,测试即可。记住需要使用POST方法.

继续修改,将PostHandler的函数修改如下

测试工具输入:

发送的内容输入:

返回结果如下:

备注:此处需要指定Content-Type为application/x-www-form-urlencoded,否则识别不出来。

一定要选择对应的PUT或者DELETE方法。

Gin框架快速的创建路由

能够方便的创建分组

支持url正则表达式

支持参数查找(c.Param c.Query c.PostForm)

请求方法精准匹配

支持404处理

快速的返回给客户端数据,常用的c.String c.JSON c.Data


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/25563.html