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

当我们访问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")
}

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

image-20231027225356894

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

1.3 HTML(*)

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

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

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

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

当我们访问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")
}

当我们访问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

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

访问: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

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

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

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

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

image-20231028162627447

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值