Hello World
1 | 安装 |
1 | package main |
路由
1 | // 省略的代码 ... |
动态路由(参数路由)
1 | // 省略的代码 ... |
路由组
1 | // 省略的代码 ... |
中间件
通过中间件的方式,验证 Auth 和身份鉴别,集中处理返回的数据等等。Gin 提供了 Middleware 的功能,并与路由紧紧相连。
单个路由中间件
1 | // 省略的代码 ... |
执行流程控制
用上面的实例代码,我们来看一下中间件是怎么执行的。
1 | // 省略的代码 ... |
可以看出,中间件的写法和路由的 Handler 几乎是一样的,只是多调用c.Next()
。
正是有个c.Next()
,我们可以在中间件中控制调用逻辑的变化,看下面的 middleware2
代码。
1 | // 省略的代码 ... |
在middleware2
中,执行到 c.Next()
时,Gin 会直接跳到流程的下一个方法中,等到这个方法执行完后,才会回来接着执行 middleware2
剩下的代码。
所以请求上面注册的路由 url /someGet
,请求先到达middleware1
,然后到达 middleware2
,但此时 middleware2
调用了 c.Next()
,所以 middleware2
的代码并没有执行,而是跳到了 handler
,等 handler
执行完成后,跳回到 middleware2
,执行 middleware2
剩下的代码。
所以我们可以在控制台上看到以下日志输出:
1 | exec middleware1 |
路由组使用中间件
路由组使用中间件和单个路由类似,只不过是要把中间件放到 Group 上。
1 | // 省略的代码 ... |
参数
URL 查询参数
假定一个 url 为 /welcome?firstname=Jane&lastname=Doe
,我们想获取参数 firstname
的内容,可以使用c.Query
方法。该方法始终返回一个 string
类型的数据。
1 | // 省略的代码 ... |
JSON Body 参数
1 | // 省略的代码 ... |
表单参数(Multipart/Urlencoded Form)
典型的如 POST
提交的数据,无论是 multipart/form-data
格式还是application/x-www-form-urlencoded
格式,都可以使用 c.PostForm
获取到参数。该方法始终返回一个 string
类型的数据。
1 | // 省略的代码 ... |
上传文件
上传文件的大小有限制,通常是<32MB
,你可以使用 router.MaxMultipartMemory
更改它。
1 | // 省略的代码 ... |
数据绑定
Gin 提供了非常方便的数据绑定功能,可以将用户传来的参数自动跟我们定义的结构体绑定在一起。
绑定 JSON Body 参数
1 | type Person struct { |
绑定 Url 查询参数(Only Bind Query String)
使用 c.ShouldBindQuery
方法,可以自动绑定 Url 查询参数到 struct
.
1 |
|
数据验证
Gin 的数据验证是和数据绑定结合在一起的。只需要在数据绑定的结构体成员变量的标签添加binding
规则即可。详细的规则查阅 这里。
来看官方给出的一段代码:
1 | // 省略的代码 ... |
输出响应
Web 应用的目标之一就是输出响应。Gin 为我们提供了多种常见格式的输出,包括 HTML
, String
,JSON
,XML
, YAML
。
String
1 | // 省略的代码 ... |
JSON、 XML、 YAML
Gin 输出这三种格式非常方便,直接使用对用方法并赋值一个结构体给它就行了。
你还可以使用gin.H
。gin.H
是一个很巧妙的设计,你可以像javascript定义json一样,直接一层层写键值对,只需要在每一层加上 gin.H即可。看代码:
1 | // 省略的代码 ... |
转载自:deng-dev