Gin框架入门
Gin框架简介
Gin框架是一个非常受欢迎的Golang Web框架,它具有语法简单明了的优点,使得初学者能够迅速入门。
Gin的Hello World
个人觉得,使用gin编写web应用不像其他框架那样。一看头都大了,给人感觉封装的东西太多了。下面是Gin的Hello World示例。
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
router.Run(":8000")
}
编写完成后,使用go build, go run就可以把这个程序跑起来了,然后在控制台还会有详细的Gin自带的日志,给我这个初学者一种保姆式的感觉。 控制台中会输出这样一行日志
[GIN-debug] Listening and serving HTTP on :9999
说明咱们的服务已经运行在8000端口上了。
这个时候在浏览器中输入127.0.0.1:8000就可以看到打印了Hello World,并且日志也输出了这次请求。
也可以使用Postman这种接口测试工具来发送Http请求。
然后来逐一看一下程序作了什么
router := gin.Default()使用Gin的Deault方法创建一个默认的路由器。- 然后用Http方法绑定路由规则和路由函数。路由规则就是url地址中的路径。路由函数的参数一定是gin.Context类型的指针,这种类型是上下文类型,值得注意的是,这个上下文类型保存有request和response。
- 我们看到路由函数中的唯一一行代码
c.String(http.StatusOK, "Hello World"),代表response的状态码是200,并且返回体中的数据是一个strinf类型,值为Hello World. - 最后启动路由的Run方法监听某个端口,记得在运行大项目的demo代码时,由于我的80端口已经被占用了,导致日志输出端口已被占用,并且直接结束了程序。
Gin响应
关于响应的部分首先要了解Http协议的响应,重要的是要知道响应码的含义,比如响应码200表示正常响应。
返回字符串
上面的Hello World程序中
返回json
c.JSON(http.StatusOK, gin.H{"user": "hanru", "message": "hey", "status": http.StatusOK})
这里注意到gin.H{},看了看源码,发现能够理解
gin.H定义是map[string]interface{},
而interface{} 可以代表任意类型,
interface{} 就是一个空接口,所有类型都实现了这个接口,所以它可以代表所有类型,
所以我们可以以map的形式插入任意类型数据
返回html
首先使用LoadHTMLGlob()来加载某个目录下的Html文件,才能够使用它们
或者使用LoadHTMLFiles()也可以加载Html文件
//加载模板
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
//根据完整文件名渲染模板,并传递参数
c.HTML(http.StatusOK, "index.html", gin.H{
"title": "Main website",
})
响应文件
router.StaticFS("/static", http.Dir("static/static"))
router.StaticFile("/titian.png", "static/titian.png")
router.StaticFS()是响应一个文件目录 在golang总,没有相对文件的路径,它只有相对项目的路径
网页请求这个静态目录的前缀, 第二个参数是一个目录,注意,前缀不要重复
router.StaticFile()是响应单个文件 配置单个文件, 网页请求的路由,文件的路径
Gin请求
同样的Gin也封装了一些函数让程序员可以方便的获取到请求的参数。
查询参数
func _query(c *gin.Context) {
user := c.Query("user"))
}
如果一个http请求使用GET方法,url是这种 127.0.0.1/?user = coco 通过query函数就可以查询到该参数的值
表单参数
user := c.PostForm("user")
和查询参数类似,如果是一个带post表单的http post请求,使用该方法可以查询到参数的值
json参数
json参数也是http协议请求中经常带的值
func _bindJson(c *gin.Context, obj any) (err error) {
body, _ := c.GetRawData()
contentType := c.GetHeader("Content-Type")
switch contentType {
case "application/json":
err = json.Unmarshal(body, &obj)
if err != nil {
fmt.Println(err.Error())
return err }
}
return nil
}
通过_bindJson函数就可以把json数据拿出来了,一般还要自己构造一个结构体来匹配json。
中间件
一个简单的中间件写法
我们回到最开头的Hello World程序,想要添加一个简单的中间件可以这样做
func m1(c *gin.Context) {
fmt.Println("m1 in.........")
}
把这个函数放入r.GET中,并且放在输出Hello World的方法前面,就可以了。就向下面这样。 这样程序就会先执行m1,在执行最后一个参数中的函数,并且,中间件可以不止一个,执行顺序也是从前到后
router.GET("/", m1, func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
可以用c.Abort()来退出执行所有函数。可以用来进行中间件拦截响应