• Go学习第十四章——Gin请求与响应


    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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当我们访问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})
    }
    
    • 1
    • 2
    • 3

    可以看到可以传任意对象,然后都会通过反射转换为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")
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    当我们访问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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后游览器就不会渲染出来了,并且相应的数据里也没有

    image-20231027225356894

    ps:这里可以传结构体,也可以传Map,包括直接传JSON,都会进行渲染

    1.3 HTML(*)

    使用HTML方法返回HTML类型的响应内容。

    先在文件夹下面创建一个templates文件夹,再创建一个index.html文件,

    写上

    你好啊, {{.username}}
    ,因为这里可以使用插值语法进行传参

    image-20231027230941273

    写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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当我们访问http://localhost:8000/users时,就能够在浏览器上看到HTML格式的输出内容。

    image-20231027231642921

    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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当我们访问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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后我们访问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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后,我们可以再static文件夹下面再放其他的文件,例如:我放了一个text.txt文件

    访问:http://localhost:8000/static/text.txt

    image-20231027234019639

    如果你想要访问图片,就直接访问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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    访问: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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    访问: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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这里我使用Apifox调用接口,比较方便,用游览器比较麻烦

    1. 先创建一个项目,我写了一个Gin学习,不重要~
    2. 左边有个接口管理,在快捷请求里新建,然后使用POST,并且写上对应的url和下面选择Body,点击form-data

    image-20231028152758905

    然后点击发送,下面就是响应的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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    访问http://127.0.0.1:8080/raw,打印的数据如图

    image-20231028155626168

    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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    打开F12,再访问:http://127.0.0.1:8080/header,通过对比看到对应的结果

    image-20231028162412900

    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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    一样使用F12,访问进行查看~

    image-20231028162627447

  • 相关阅读:
    基于HTTP构建YUM网络源
    Java基础
    任务十一 BERT
    vue3组件事件传参
    阿里云服务器ECS实例规格族字母命名说明
    继承关系中构造函数、析构函数的调用顺序详解
    吉比特第三季营收13亿:靠“羊了个羊”走红 卢竑岩获分红3亿
    TRUNK通信过程
    组件——组件名、非单文件组件、单文件组件
    基于ssm框架的毕业设计管理系统毕业设计源码211633
  • 原文地址:https://blog.csdn.net/Hai_Helloyou/article/details/134094120