Go web框架——Gin(请求与响应)
- 1 响应
- 1.1 String
- 1.2 JSON(*)
- 1.3 HTML(*)
- 1.4 XML
- 1.5 文件(*)
- 2 请求
- 2.1 请求参数
- 查询参数 (Query)
- 动态参数 (Param)
- 表单参数 (PostForm)
- 原始参数 (GetRawData)
- 2.2 请求头
- 2.3 响应头
1 响应
在Gin中,我们可以使用不同的方法设置请求的响应值,包括String、JSON、HTML和XML等。
1.1 String
使用String方法返回字符串类型的响应内容。
func main() {
r := gin.Default()
r.GET("/users", func(c *gin.Context) {
c.String(http.StatusOK, "Users")
})
r.Run(":8080")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到输出了"Users"。
补充:这里的http.StatusOK,是可以修改的,可以直接写200,因为200对应就是响应成功。
1.2 JSON(*)
使用JSON方法返回JSON类型的响应内容。
这里把结构体混进来,一般都会去拿结构体的JSON内容
这段代码:c.JSON(http.StatusOK, stu)
的JSON方法是自动转换的
func (c *Context) JSON(code int, obj any) {
c.Render(code, render.JSON{Data: obj})
}
可以看到可以传任意对象,然后都会通过反射转换为JSON数据格式
type student struct {
Name string `json:"name"`
Age int `json:"age"`
}
func _json(c *gin.Context) {
stu := student{"张三", 18}
c.JSON(http.StatusOK, stu)
}
func main() {
r := gin.Default()
r.GET("/users", _json)
r.Run(":8000")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到JSON格式的输出内容。
进阶使用方式:
我们传JSON的时候,可以对结构体不想渲染的字段进行隐藏,例如:密码
只需要再结构体的标签里,修改成这样即可:Password string json:"-"
type user struct {
Username string `json:"username,omitempty"`
Password string `json:"-"`// 忽略转换为json
}
func _json(c *gin.Context) {
userInfo := user{"张三", "123456"}
c.JSON(http.StatusOK, userInfo)
}
func main() {
r := gin.Default()
r.GET("/users", _json)
r.Run(":8000")
}
然后游览器就不会渲染出来了,并且相应的数据里也没有
ps:这里可以传结构体,也可以传Map,包括直接传JSON,都会进行渲染
1.3 HTML(*)
使用HTML方法返回HTML类型的响应内容。
先在文件夹下面创建一个templates文件夹,再创建一个index.html文件,
写上<header>你好啊, {{.username}}</header>
,因为这里可以使用插值语法进行传参
写main函数的时候,注意需要告诉服务器index文件在哪,所以需要使用这个函数进行加载
func main() {
r := gin.Default()
r.LoadHTMLGlob("GinStudy01_HelloWord/templates/*") // 加载目录下的所有文件(全局加载)
r.GET("/users", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{
"username": "张三",
})
})
r.Run(":8000")
}
当我们访问http://localhost:8000/users时,就能够在浏览器上看到HTML格式的输出内容。
1.4 XML
使用XML方法返回XML类型的响应内容。
func main() {
r := gin.Default()
r.GET("/users", func(c *gin.Context) {
c.XML(http.StatusOK, gin.H{
"name": "Tom",
"age": 18,
})
})
r.Run(":8080")
}
当我们访问http://localhost:8080/users时,就能够在浏览器上看到XML格式的输出内容。
1.5 文件(*)
将文件服务于指定的URL路径上,可以用于提供静态资源(如图片、CSS文件、JavaScript文件等)
创建一个文件夹static,然后放一个文件进去,例如:我放了一个图片,image.jpg文件
StaticFile
提供的是一个单个文件的静态服务,将指定的文件服务于指定的URL路径上,使用这个方法时,只需指定文件的绝对路径和访问路径即可:
func main() {
r := gin.Default()
r.StaticFile("static/image.jpg", "GinStudy01_HelloWord/static/image.jpg")
r.Run(":8000")
}
然后我们访问http://localhost:8000/static/image.jpg,就可以响应到对应的图片
StaticFs
提供的是一个基于http.FileSystem的静态文件服务,可以将多个静态文件目录映射到不同的访问路径下
func main() {
r := gin.Default()
fs := http.Dir("GinStudy01_HelloWord/static")
r.StaticFS("/static", fs)
r.Run(":8000")
}
然后,我们可以再static文件夹下面再放其他的文件,例如:我放了一个text.txt文件
访问:http://localhost:8000/static/text.txt
如果你想要访问图片,就直接访问http://localhost:8000/static/image.jpg即可
2 请求
2.1 请求参数
查询参数 (Query)
func _query(c *gin.Context) {
// 使用query
name := c.Query("name")
age := c.Query("age")
// 处理查询参数
c.JSON(http.StatusOK, gin.H{
"name": name,
"age": age,
})
fmt.Printf("name=%v, age=%v", name, age)
}
func main() {
router := gin.Default()
router.GET("/query", _query)
router.Run(":8080")
}
访问:http://127.0.0.1:8080/query?name=张三&age=18
,就会看到结果,并且打印在Goland上面
动态参数 (Param)
func _param(c *gin.Context) {
// 使用Param方法
id := c.Param("id")
// 处理动态参数
c.JSON(http.StatusOK, gin.H{
"id": id,
})
}
func main() {
router := gin.Default()
// 注意:这里动态参数是这里不同
router.GET("/user/:id", _param)
router.Run(":8080")
}
访问:http://127.0.0.1:8080/user/1
,就能看到结果
表单参数 (PostForm)
func _postForm(c *gin.Context) {
// 使用PostForm方法
name := c.PostForm("name")
age := c.PostForm("age")
// 处理表单参数
c.JSON(http.StatusOK, gin.H{
"name": name,
"age": age,
})
fmt.Printf("name=%v, age=%v", name, age)
}
func main() {
router := gin.Default()
// 表单是POST请求
router.POST("/users", _postForm)
router.Run(":8080")
}
这里我使用Apifox调用接口,比较方便,用游览器比较麻烦
- 先创建一个项目,我写了一个Gin学习,不重要~
- 左边有个接口管理,在快捷请求里新建,然后使用POST,并且写上对应的url和下面选择Body,点击form-data
然后点击发送,下面就是响应的JSON数据
原始参数 (GetRawData)
func _raw(c *gin.Context) {
body, _ := c.GetRawData()
fmt.Println(string(body))
}
func main() {
router := gin.Default()
router.POST("/raw", _raw)
router.Run(":8080")
}
访问http://127.0.0.1:8080/raw,打印的数据如图
2.2 请求头
请求头参数获取
GetHeader
,可以大小写不分,且返回切片中的第一个数据
func _header(c *gin.Context) {
// 首字母大小写不区分 单词与单词之间用 - 连接
// 用于获取一个请求头
fmt.Println(c.GetHeader("User-Agent"))
//fmt.Println(c.GetHeader("user-agent"))
// Header 是一个普通的 map[string][]string
fmt.Println(c.Request.Header)
// 如果是使用 Get方法或者是 .GetHeader,那么可以不用区分大小写,并且返回第一个value
fmt.Println(c.Request.Header.Get("User-Agent"))
fmt.Println(c.Request.Header["User-Agent"])
// 如果是用map的取值方式,请注意大小写问题
fmt.Println(c.Request.Header["user-agent"])
// 自定义的请求头,用Get方法也是免大小写
fmt.Println(c.Request.Header.Get("Token"))
fmt.Println(c.Request.Header.Get("token"))
c.JSON(200, gin.H{"msg": "成功"})
}
func main() {
router := gin.Default()
router.GET("/header", _header)
router.Run(":8080")
}
打开F12,再访问:http://127.0.0.1:8080/header,通过对比看到对应的结果
2.3 响应头
设置响应头的方式
func _header(c *gin.Context) {
c.Header("Token", "jhgeu%hsg845jUIF83jh")
c.Header("Content-Type", "application/text; charset=utf-8")
c.JSON(0, gin.H{"data": "看看响应头"})
}
func main() {
router := gin.Default()
router.GET("/header", _header)
router.Run(":8080")
}
一样使用F12,访问进行查看~