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,访问进行查看~

![[导弹打飞机H5动画制作]飞机路线的随机起飞及自爆模拟](https://img-blog.csdnimg.cn/f56e0b36039347ff882d460398182dae.png)





![Kitex踩坑 [Error] KITEX: processing request error,i/o timeout](https://img-blog.csdnimg.cn/cb3a490b2ba943d5b4e6edb18a1b1095.png)





![[SpringCloud] Nacos 简介](https://img-blog.csdnimg.cn/8cbdced4ed6b411ea71148af60c45222.png)






