Gin
介绍
gin框架是一个基于go语言的轻量级web框架,它具有高效性、灵活性、易扩展性
路由
gin框架使用的是定制版的httprouter
其路由原理是大量使用公共前缀的树结构,注册路由的过程就是构造前缀树的过程。
具有公共前缀的节点也共享一个公共父节点。
r := gin. Default ( )
r. GET ( "/hello" , func ( c * gin. Context) {
c. JSON ( 200 , gin. H{ "message" : "Hello, world!" } )
} )
r. POST ( "/login" , loginHandler)
r. Run ( ":8080" )
r. GET ( "/users/:username" , getUsers)
r. GET ( "/articles/:id([0-9]+)" , getArticleByID)
admin := r. Group ( "/admin" )
admin. Use ( AuthMiddleware)
admin. GET ( "/users" , listAdminUsers)
admin. POST ( "/users" , createAdminUser)
r. GET ( "/old-path" , func ( c * gin. Context) {
c. Redirect ( http. StatusMovedPermanently, "/new-path" )
} )
处理函数接收一个 * gin. Context 参数,该对象包含了请求和响应的所有相关信息, 通常完成以下任务:
- 读取请求数据:通过 c. Query ( ) 、c. PostForm ( ) 、c. ShouldBind ( ) 等方法获取查询参数、表单数据或 JSON/ XML 等请求体内容
- 响应数据:使用 c. JSON ( ) 、c. XML ( ) 、c. String ( ) 、c. File ( ) 等方法向客户端发送响应
- 中间件:调用 c. Next ( ) 传递控制权给下一个中间件或者结束请求
v1 := r. Group ( "/api/v1" , authMiddleware)
{
users := v1. Group ( "/users" )
{
users. GET ( "/:id" , getUser)
users. POST ( "/" , createUser)
}
articles := v1. Group ( "/articles" )
{
articles. GET ( "/:id" , getArticle)
articles. POST ( "/" , createArticle)
}
}
auth := r. Group ( "/auth" , AuthMiddleware)
{
auth. GET ( "/login" , loginHandler) . Name ( "login" )
auth. POST ( "/logout" , logoutHandler) . Name ( "logout" )
}
loginURL := r. MustGet ( "login" ) . URL ( )
中间件
中间件常用来实现一些通用的功能,如日志记录、权限校验、数据加工等
分为全局中间件和局部中间件两种类型:全局中间件作用于所有路由之前,局部中间件则是作用于某个路由或路由组之前。
1. c. Next ( ) : 调用该函数会将控制权交给下一个中间件函数,如果没有下一个中间件函数,则将控制权交给处理请求的路由处理函数
2. c. Abort ( ) : 调用该函数会立即终止当前中间件函数的执行,并且不会再调用后续的中间件函数或路由处理函数
3. c. AbortWithStatus ( code int ) : 调用该函数会终止当前中间件函数的执行,并返回指定的HTTP状态码给客户端
4. c. NextWithError ( ) : 调用该函数会将控制权交给下一个中间件函数,同时传递一个错误给下一个中间件函数或路由处理函数
5. c. IsAborted ( ) : 该函数用于判断当前请求是否已经被终止,返回一个布尔值表示请求是否已经被终止
context
用于处理 HTTP 请求和响应,是通过中间件来传递的
在 Gin 的处理流程中,Context 贯穿整个处理过程,用于传递请求和响应的信息
Bind ( ) 系列函数:根据request的数据类型,将其解析到结构体或map 里
有成员Keys,上游需要传递的变量可以放在里面,下游处理时再从里面取出来,实现上下游参数传递, 对应Set ( ) 和Get ( ) 方法
c. JSON ( )
c. String ( )
c. HTML ( )