gin web 网络框架
gin框架介绍
gin是一个golang的微框架,封装比较优雅,api友好,源码注释比较明确,具有快速灵活,容错方便等特点。
gin特点和特性
-
速度:gin之所以被很多企业和团队所采用,第一个原因是因为其速度快,性能表现出众。基准测试
-
中间件:和iris类型,gin在处理请求时,支持中间件操作,方便编码处理。
-
路由:在gin中可以非常简单的实现路由解析的功能,并包含路由组解析功能。
-
内置渲染:gin支持json、xml和html等多种数据格式的渲染,并提供了方便的操作api。
gin网络请求与路由处理
创建engine
- engine被定义成代表gin框架的一个结构体。其中包含了路由组、中间件、页面渲染接口、框架配置设置等相关内容。
- 默认的engine可以通过gin.default进行创建,或者使用gin.new()同样可以创建。router := gin.new()/ router := gin.default()
- gin.default()和gin.new()的区别在于gin.default也使用gin.new()创建engine实例,但是会默认使用logger和recovery中间件。
- logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试;recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.default创建engine实例。
处理http请求
restful路由通用处理
- handle():在engine中使用handle方法进行http请求的处理。handle方法包含三个参数,具体如下所示:
- func (group *routergroup) handle(httpmethod, relativepath string, handlers …handlerfunc) iroutes
- httpmethod:第一个参数表示要处理的http的请求类型,是get、post、delete等8种请求类型中的一种。
- relativepath:第二个参数表示要解析的接口,由开发者进行定义。
- handlers:第三个参数是处理对应的请求的函数。
restful路由分类处理
除了通用方法,engine还可以按类型进行直接解析。engine中包含有get方法、post方法、delete方法等与http请求类型对应的方法。
- engine.get()处理get请求,
- engine.post()处理post请求
- 。。。
gin.context
context是gin框架中封装的一个结构体,这是gin框架中最重要,最基础的一个结构体对象。该结构体可以提供我们操作请求,处理请求,获取数据等相关的操作,通常称之为上下文对象,简单说为我们提供操作环境。
-
context.param 获取请求参数:在路由地址中: 一个参数名组成路由参数。可以使用c.params的方法读取其值。(区分版本:version := c.param(“version”),router.group(“/im/:version”,func)
-
context.query和context.defaultquery获取get请求携带的参数。其中defaultquery提供默认值,getquery返回值之外还包括参数是否存在。
-
http的报文体传输数据常见的格式就有四种。例如application/json,application/x-www-form-urlencoded, application/xml和multipart/form-data。后面一个主要用于图片上传。
-
context.postform获取表单数据:
- postform从 post url编码表单或multipart表单中返回指定的键,否则返回一个空字符串。
- 除此之外,还可以使用context.getpostform来获取表单数据。其中context.getpostform除了返回获取到的值之外还会返回数据是否存在的标志。
-
context.bindjson获取post请求中的json数据。
-
context.clientip:clientip实现了一个最大努力的算法来返回真实的客户端ip用于问题定位。
-
context.writer.write向请求发起端返回数据。
-
context.data:将一些数据写入响应体并更新http代码。
-
context.json():json将给定的结构作为json序列化到响应体中。
-
context.fullpath:返回匹配的路由的全路径。对于未找到的路由返回一个空字符串。
请求参数绑定与多数据格式处理
表单实体绑定
如果表单数据较多时,使用postform和getpostform一次获取一个表单数据,开发效率较慢。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。
- 使用shouldbindquery可以实现get方式的数据请求的绑定。
- 使用shouldbind可以实现post方式的提交数据的绑定工作。shouldbind会检查content-type来自动选择一个绑定引擎,根据“content-type”头的不同会使用不同的绑定。
- 当客户端使用json格式进行数据提交时,使用bindjson可以实现对数据进行绑定并自动解析。
多数据格式返回请求结果
- context.writer.write方法写入[]byte数据。这里的write是http.responsewriter接口定义的。
- writer是gin框架中封装的一个responsewriter接口类型。此外,responsewriter自身还封装了writestring方法返回数据。
- 在项目开发中,json格式规范使用的更为普遍。gin框架中的context包含的json方法可以将结构体类型的数据转换成json格式的结构化数据,然后返回给客户端。
- map[string]interface map类型的数据转换成为json格式并返回给前端
- 结构体也是可以直接转换为json格式返回给客户端。
- 除了json格式以外,gin框架还支持返回html格式的数据。可以直接渲染html页面。
- gin.h封装了生成json的方式,是一个强大的工具。使用golang可以像动态语言一样写字面量的json,对于嵌套json的实现,嵌套gin.h即可。在gin中实际是定义为:type h map[string]interface{}。
使用路由组分类处理请求
在实际的项目开发中,均是模块化开发。同一模块内的功能接口,往往会有相同的接口前缀,因此gin提供了路由组的概念,实现对路由的分类。
-
路由组是router.group中的一个方法,用于对请求进行分组。
-
grouproute:=engine.group(“/group”)
-
group返回一个routergroup指针对象,而routergroup是gin框架中的一个路由组结构体定义。
type routergroup struct { handlers handlerschain basepath string engine *engine root bool }