Go学习第十三章——Gin(请求与响应)

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")
}

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

Go学习第十三章——Gin(请求与响应)_第1张图片

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

1.3 HTML(*)

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

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

写上

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

Go学习第十三章——Gin(请求与响应)_第2张图片

写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格式的输出内容。

Go学习第十三章——Gin(请求与响应)_第3张图片

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

Go学习第十三章——Gin(请求与响应)_第4张图片

如果你想要访问图片,就直接访问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调用接口,比较方便,用游览器比较麻烦

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

Go学习第十三章——Gin(请求与响应)_第5张图片

然后点击发送,下面就是响应的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,打印的数据如图

Go学习第十三章——Gin(请求与响应)_第6张图片

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,通过对比看到对应的结果

Go学习第十三章——Gin(请求与响应)_第7张图片

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

Go学习第十三章——Gin(请求与响应)_第8张图片

你可能感兴趣的:(golang,学习,gin,开发语言,笔记,后端)