GO框架之gin入门
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一、gin发展历史
Gin最早是在2014年由Manu Martinez-Almeida创建的,他是一个来自阿根廷的软件工程师,他在GitHub上发布了Gin的第一个版本
Gin的灵感来源于Martini,一个用Go语言编写的简洁而强大的web框架,但是Martini使用了反射机制,导致性能较低(github.com/gin-gonic/g…)
二、gin是什么?
Gin是一个使用Go语言开发的Web框架。
它提供类似Martini的API,但性能更佳,速度提升高达40倍。(这里不多赘述Martini是什么了)
三、环境配置
go get github.com/gin-gonic/gin
四、gin常用方法
-
Gin的常用方法
- Gin只需调用gin.Default()函数即可来创建一个web应用实例
- Gin支持使用GET、POST、PUT、DELETE等HTTP方法来定义路由规则,并且可以使用参数和通配符来匹配动态URL。
- Gin可以通过中间件来处理HTTP请求,中间件是一些在请求到达最终处理函数之前或之后执行的函数,可以用来实现日志、授权、压缩等功能。
- Gin可以通过c.JSON()、c.XML()、c.HTML()等方法来渲染不同格式的响应数据,并且可以自定义渲染器。
- Gin可以通过c.Bind()、c.BindJSON()、c.BindXML()等方法来解析和验证请求数据,例如检查JSON中是否存在必需的值。
- Gin可以通过c.Param()、c.Query()、c.DefaultQuery()、c.PostForm()、c.DefaultPostForm()等方法来获取请求中的参数和表单数据。
下面是代码示例
func main(){
//创建实例
r := gin.Default()
//设置网页图标
ginServer.Use(favicon.New("./OIG.jpg"))
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//加载静态文件 相对路径 绝对路径
ginServer.Static("/static", "./static")
//监听端口
r.run(":8080")
}
然后我们go run .就可以开启服务了
在浏览器输入 localhost:8080然后回车
这时候我们可以在浏览器上看见
404 page not found
这是因为我们还没有设置访问路径,我们写一个get响应,在访问/ping时页面会返回一个json数据{"msg":"pong"}
func main(){
//创建实例
r := gin.Default()
//localhost:8080/ping
r.GET("/ping", func(context *gin.Context) {
context.JSON(200, gin.H{
"msg": "pong",
})
})
//监听端口
r.run(":8080")
}
我们再运行,访问localhost:8080/ping这样服务端就成功给浏览器返回了一个{"msg":"pong"}
我们可以通过gin给我们的*gin.Context.Param方法获取url中的数据
我们再写一个get方法来获取url中携带的参数
// /user/info/1/xingzhou
r.GET("/user/info/:userId/:userName", func(ctx *gin.Context) {
userId := ctx.Param("userId")
userName := ctx.Param("userName")
ctx.JSON(200, gin.H{
"userId": userId,
"userName": userName,
})
})
我们运行,然后浏览器访问localhost:8080/user/info/1/xingzhou
可以看见服务端成功将url后面携带的参数给返回 ,当然,不止这一种方式
// /user/info?userId=1&userName=xingzhou
r.GET("/user/info", myHandler(), func(ctx *gin.Context) {
userId := ctx.Query("userId")
userName := ctx.Query("userName")
ctx.JSON(200, gin.H{
"userId": userId,
"userName": userName,
})
})
获取前端返回的表单
//获取表单数据
ginServer.POST("/user/add", func(ctx *gin.Context) {
userName := ctx.PostForm("userName")
password := ctx.PostForm("password")
ctx.JSON(200, gin.H{
"smg": "ok",
"userName": userName,
"password": password,
})
})
处理返回的文件流数据,需要编写相应的前端组件
// 处理文件流请求
ginServer.POST("/upload", func(ctx *gin.Context) {
//从请求中读取文件
f, err := ctx.FormFile("f1")
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{
"err": err.Error(),
})
} else {
//将文件保存至本地
ctx.JSON(200, gin.H{
"smg": "ok",
}
//存储当前文件夹下的files文件夹下
dst := fmt.Sprintf("./files/%s", f.Filename)
ctx.SaveUploadedFile(f, dst)
}
})
可以实现路由重定向,当访问/test时直接跳转哔哩哔哩
//路由
ginServer.GET("/test", func(ctx *gin.Context) {
//重定向 301
ctx.Redirect(301, "https://www.bilibili.com")
})
当访问了不存在的路径时,实现404重定向(这里需要在templates文件夹下创建404.html)
//404
ginServer.NoRoute(func(ctx *gin.Context) {
ctx.HTML(404, "404.html", nil)
})
可以创建路由组,访问时需要加上路由前缀/User
//路由组
userGroup := ginServer.Group("/User")
userGroup.GET("/add")
userGroup.POST("/login")
userGroup.POST("/logout")
相关的前后端资源文件在ygxiaobai111/go_gin: 一个用于学习gin的小Demo (github.com)(运行前记得go mod tidy)