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

news2024/9/9 5:26:54

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1145097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA:集合框架常见的面试题和答案

1、List接口的常见实现类有哪些&#xff1f; 答&#xff1a; 常见的List接口实现类包括&#xff1a; ArrayList: 基于动态数组实现的List&#xff0c;支持快速随机访问。LinkedList: 基于链表实现的List&#xff0c;支持快速的插入和删除操作。Vector: 一个线程安全的动态数组…

GnuTLS recv error (-110): The TLS connection was non-properly terminated

ubuntu git下载提示 GnuTLS recv error (-110): The TLS connection was non-properly terminated解决方法 git config --global --unset http.https://github.com.proxy

异步请求池——池式组件

前言 本文详细介绍异步请求池的实现过程&#xff0c;并使用DNS服务来测试异步请求池的性能。            两个必须牢记心中的概念&#xff1a; 同步&#xff1a;检测IO 与 读写IO 在同一个流程里异步&#xff1a;检测IO 与 读写IO 不在同一个流程 同步请求 与 异步请求…

C++入门精讲——入门看完这一篇就够了

文章目录 前言1. C发展历史2. 关键字3. 命名空间3.1 命名空间的概念3.2 命名空间的定义3.3 命名空间的使用 4. C输入、输出5. 缺省参数5.1 全缺省5.2 半缺省 6. 函数重载6.1 几种不同类型的函数重载6.2 函数重载的原理——名字修饰(name Mangling)6.2.1 C程序为什么不支持函数重…

SpringCore完整学习教程5,入门级别

本章从第6章开始 6. JSON Spring Boot提供了三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的和默认的库。 6.1. Jackson 为Jackson提供了自动配置&#xff0c;Jackson是spring-boot-starter-json的一部分。当Jackson在类路径上时&#xff0c;将自动配置Obj…

【目标检测】Visdrone数据集和CARPK数据集预处理

之前的博文【目标检测】YOLOv5跑通VisDrone数据集对Visdrone数据集简介过&#xff0c;这里不作复述&#xff0c;本文主要对Visdrone数据集和CARPK数据集进行目标提取和过滤。 需求描述 本文需要将Visdrone数据集中有关车和人的数据集进行提取和合并&#xff0c;车标记为类别0&…

软考系列(系统架构师)- 2010年系统架构师软考案例分析考点

试题一 软件系统架构选择 【问题1】&#xff08;7分&#xff09; 在实际的软件项目开发中&#xff0c;采用恰当的架构风格是项目成功的保证。请用200字以内的文字说明什么是软件架构风格&#xff0c;并对主程序-子程序和管道-过滤器这两种架构风格的特点进行描述。 软件架构风…

【C语言数据结构——————排序(1万字)】

文章目录 排序的概念 常见排序算法分类冒泡排序 时间复杂度稳定性 原理实现插入排序 时间复杂度稳定性实现选择排序 时间复杂度稳定性实现希尔排序 时间复杂度稳定性希尔排序的算法思想实现 优化快速排序 时间复杂度空间复杂度稳定性实现 三数取中优化归并排序 时间复杂度空间复…

windows下OOM排查

如下有一段代码 package com.lm.demo.arthas.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.A…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具&#xff0c;可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月&#xff0c;就有一个新版本&#xff0c;其官网是&#xff1a; https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

maven之父子工程版本控制案例实战,及拓展groupId和artifactId的含义

<parent>标签 用于父子工程项目&#xff0c;什么是父子工程&#xff1f; 顾名思义&#xff0c;maven父子项目是一个有一个父项目&#xff0c;父项目下面又有很多子项目的maven工程&#xff0c;当然&#xff0c;子项目下面还可以添加子项目&#xff0c;从而形成一个树形…

GPS学习(一):在ROS2中将GPS经纬度数据转换为机器人ENU坐标系,在RVIZ中显示坐标轨迹

文章目录 一、GPS模块介绍二、坐标转换转换原理参数解释&#xff1a; 增加回调函数效果演示 本文记录在Ubuntu22.04-Humbel中使用NMEA协议GPS模块的过程&#xff0c;使用国产ROS开发板鲁班猫(LubanCat )进行调试。 一、GPS模块介绍 在淘宝找了款性价比较高的轮趣科技GPS北斗双…

AD7321代码SPI接口模数转换连接DAC0832输出verilog

名称&#xff1a;AD7321代码12位ADC&#xff0c;SPI接口模数转换连接DAC0832输出 软件&#xff1a;QuartusII 语言&#xff1a;VHDL 代码功能&#xff1a; 使用VHDL语言编写代码&#xff0c;实现AD7321的控制&#xff0c;将模拟信号转换为数字信号&#xff0c;再经过处理后…

fatfs对于exFAT的使用

f_mkfs的介绍 f_mkfs是FatFs库中的一个函数&#xff0c;用于在指定的磁盘上执行格式化操作。它可以用于创建新的文件系统或重新格式化已有的文件系统。 函数原型如下&#xff1a; FRESULT f_mkfs (const TCHAR* path, // 磁盘路径BYTE opt, // 格式化选项DWORD a…

【QT】点击按钮弹出对话框的注意事项

在stack区创建对话框对象 模态对话框&#xff0c;不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。 问题代码1: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//点击新建按钮&#xff0c;弹出一…

设计模式【Iterator 模式】

Iterator 模式 1.什么是 Iterator 模式 Iterator 模式就是按照顺序遍历数据集合。 2.示例程序 1.Aggregate 接口 Aggregate 接口是要遍历的集合的接口&#xff0c;声明方法 iterator &#xff0c;实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。 public int…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

【神印王座】易军献身为林鑫挡箭,万万没想到林鑫太坑,大跌眼镜

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《神印王座》动漫最新剧集中&#xff0c;龙皓晨离开后&#xff0c;恶魔族新的援兵突然出现&#xff0c;使得队友们面临了前所未有的困境。这次战斗中&#xff0c;易军与圣采儿等人决定正面攻击恶魔统领&#xff0c;这无疑…

JVM基础:字节码文件详解①

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Java虚拟机的组成二、字节码文件的组成2.1 为什么要了解字节码文件&#xff1f;2.2 如何“窥探”字节码文件的奥秘&#xff1f;2.2.1 使用工具打开字节码文件2.…

09循环嵌套

循环嵌套顾名思义循环里面套循环 # 循环嵌套顾名思义循环里面套循环a 1 b 0 while a < 10:# print(1, a)b 1while b < a and b < 10:print("%d*%d%d" % (b, a, a * b), end" ")b 1print()a 1format 格式化运算符 只需要填入数据即可 print(…