gin使用
1.什么是gin?
gin是基于go编写http的web服务框架,Web 服务是"网络服务"(Web Service),其本质就是通过网络调用其他网站的资源。通过80端口向外界提供网页访问。有了gin就可以从外面通过网址访问应用的页面。例如,在搜索栏输入网址就可以找到相应页面,网址则是在gin框架里定义
2.如何使用gin?
2.1 使用gin:需先准备go环境
通过该命令将gin添加到你的项目中
go get -u github.com/gin-gonic/gin
2.2 创建一个简单的web服务
例子如下:
package main
import "github.com/gin-gonic/gin" //导入gin包到go文件
func main() {
r := gin.Default() //创建gin.Default()引擎实例
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ //处理响应
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
web服务详细分析:
- 该gin.Default()函数可以做以下五件事:
-
创建一个Gin引擎实例。如:
r := gin.Default() -
设置了默认的日志中间件,用于记录每个请求的信息,如请求方法、路径、响应状态码等。如
router.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello, World!", }) })。c *gin.Context是处理 HTTP 请求的上下文对象- 用来存储请求和响应的信息
-
Request相关信息:
-
ResponseWriter相关信息:
-
参数和路径信息:
- 路由参数:使用:定义,如
/user/:id,路由参数是可选的,即使没有提供参数值,路由仍然可以匹配 - 路径参数:使用{}定义,如
/user/{id},路径参数必须提供参数值才能使路由匹配成功 - 都通过c.Param方法获取参数
c.Param("name")
- 路由参数:使用:定义,如
-
查询参数和表单数据:
- 查询参数是通过 URL 的查询字符串传递的参数,查询字符串是 URL 中位于问号(?)后面的部分,用于传递键值对的参数
- 表单参数:通过 HTTP 请求的请求体传递的参数。使用POST请求
-
Cookies 相关信息:
- 请求中的 Cookie
- 设置响应的 Cookie
-
- 提供一系列方法来处理请求和响应
- 处理请求:
c.Request:获取请求信息,如c.Request.Method,c.Request.Cookie("cookie_name")c.Params:获取路由参数c.Query:获取 URL 查询参数c.PostForm:获取表单参数
- 处理响应:
c.JSON:以 JSON 格式响应数据给客户端。c.String:以纯文本格式响应数据给客户端。c.HTML:渲染 HTML 模板并响应给客户端。c.Redirect:执行重定向到其他路径或 URL。c.Abort:终止请求的处理,不再执行后续的中间件和处理函数
- 处理请求:
- 用来存储请求和响应的信息
-
设置了默认的恢复中间件,用于在应用程序发生恐慌(panic)时恢复并返回一个500内部服务器错误响应。如
router.GET("/panic", func(c *gin.Context) { panic("Oops! Something went wrong.") }) -
设置了默认的错误处理中间件,用于捕获和处理路由处理函数中产生的错误。
if err != nil { // 将错误信息作为响应返回给客户端 c.JSON(500, gin.H{ "error": err.Error(), }) return } -
启用了Gin框架的路由功能。如:
r.GET("ping", bbsApi.GetXkBbs),r.POST("ping", bbsApi.GetXkBbs)当客户端向"/ping"路径发起GET请求时,执行对应的处理函数
-
2.3路由组分组
例子如下:
v1 := router.Group("/v1") { v1.GET("/user/:id", getUserByID) v1.POST("/user", createUser) }
2.4文件上传
文章推荐 gin框架及介绍使用
总结:
- 在看程序时,分析问题时先分类:分清楚处理请求还是在处理响应。
- 请求参数,要传递数据一般只有两种方法:查询参数和表单参数。细节看文章
- 无法请求到页面,先查看网址,gin里是否定义的正不正确。如非网址问题则是未在gin中注册路由,网址的写法只有四种:
- 表单参数: 网址/user/search,使用post请求,则使用c.PostForm("username")获取参数
- 查询参数:用?号定义传递参数。使用get请求 example.com/path?param1…
- 路径参数:/user/{id},使用get请求 r.GET("/user/search/{username}/{address}",ser.getSer)
- 路由参数:/user/:id,使用get请求 r.GET("/user/search/:username/:address",ser.getSer)