GoWeb -- gin框架的入门和使用(2)

news2025/1/18 6:23:18

前言

书接上回,在gin的框架使用中,还有着许多方法以及它们的作用,本篇博客将会接着上次的内容继续记录本人在学习gin框架时的思路和笔记。
如果还没有看过上篇博客的可以点此跳转。

map参数

请求url: http://localhost:8080/user/save?addressMap[home]=Beijing&addressMap[company]=shanghai

	//map形式获取参数
	r.GET("/user/save", func(context *gin.Context) {
		addressMap := context.QueryMap("addressMap")
		context.JSON(200, addressMap)
	})

一般我们使用context.QueryMap方法来获取map类型的参数。

在这里插入图片描述

Post请求参数

post请求一般是表单参数和json参数

表单参数

	r.POST("/user/save", func(context *gin.Context) {
		username := context.PostForm("username")
		password := context.PostForm("password")

		context.JSON(200, gin.H{
			username: username,
			password: password,
		})
	})

一般使用context.PostForm获取表单元素对应value的值

这里简单写了一个表单界面

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form action="http://localhost:8080/user/save" method="post">
        name:<input type="text" name="username">
        password:<input type="text" name="password">
        <input type="submit" value="提交">
    </form>

</body>

</html>

在这里插入图片描述
是这个样子的,分别填写内容并点击提交

在这里插入图片描述
在这里插入图片描述
服务器就会接收这两个参数并返回

json参数

json参数形如:

{
	"id":1111,
	"name":"张三",
	"address":[
		"beijing",
		"shanghai"
		]
}
//获取json参数
	r.POST("/user/json", func(context *gin.Context) {
		var user User
		context.ShouldBindJSON(&user)
		context.JSON(200,user)
	})

路径参数

请求url:http://localhost:8080/user/save/111

//获取路径参数
	r.GET("/user/save/:id/:name", func(context *gin.Context) {
		id := context.Param("id")
		name := context.Param("name")
		context.JSON(200, gin.H{
			"id":   id,
			"name": name,
		})
	})

在这里插入图片描述

第二种 方法


type User struct {
	Id      int64    `form:"id" uri:"id"'`
	Name    string   `form:"name" uri:"name"`
	Address []string `form:"address"`
}

	//获取路径参数
	r.GET("/user/save/:id/:name", func(context *gin.Context) {
		var user User
		context.ShouldBindUri(&user)
		//id := context.Param("id")
		//name := context.Param("name")
		context.JSON(200, user)
	})

在这里插入图片描述

文件参数

	//获取文件参数
	r.POST("/user/file", func(context *gin.Context) {
		form, err := context.MultipartForm()
		if err != nil {
			log.Println(err)
		}

		value := form.Value
		files := form.File
		for _, fileArray := range files {
			for _, v := range fileArray {
				context.SaveUploadedFile(v, "./"+v.Filename)
			}
		}

		context.JSON(200, value)
	})

我们一般使用form, err := context.MultipartForm()获取文件
form.Value是文件的值
form.File是整个文件
context.SaveUploadedFile可以把文件储存在本地

响应

响应就是客服端把请求发过来的时候我们给客户端响应信息的数据
响应的方式可以有很多种

返回字符串的形式

	r.GET("/get/response", func(context *gin.Context) {
		context.String(200, "this is %s", "response string")
	})

在这里插入图片描述

返回json方式

	//返回json形式
	r.GET("/get/json", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"xxx":"xxx",
		})
	})

模板渲染

模板是golang语言的一个标准库,使用场景很多,gin框架同样支持模板

基本使用

定义一个存放模板文件的templates文件夹
并新建index.html

在这里插入图片描述
在index.html下写入

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Title</title>
</head>
<body>
{{.title}}
</body>
</html>

后端:

	//加载模板
	r.LoadHTMLFiles("./templates/index.html")
	r.GET("/index", func(context *gin.Context) {
		context.HTML(200, "index.html", gin.H{
			"title": "hello",
		})
	})

服务器启动后访问localhost:8080/index

在这里插入图片描述

多个模板渲染

	//加载模板
	r.LoadHTMLGlob("./template/**")
	//r.LoadHTMLFiles("./templates/index.html", "./remplates/user.html")
	r.GET("/index", func(context *gin.Context) {
		context.HTML(200, "index.html", gin.H{
			"title": "hello",
		})
	})
	r.GET("user", func(context *gin.Context) {
		context.HTML(200, "index.html", gin.H{
			"title": "hello user",
		})
	})

多模板渲染一般使用r.LoadHTMLGlob(“./template/**”)

自定义模板函数

	//自定义模板函数
	r.SetFuncMap(template.FuncMap{
		"safe":func(str string) template.HTML{
			return template.HTML(str)
		},

	})

	//加载模板
	r.LoadHTMLGlob("./template/**")
	//r.LoadHTMLFiles("./templates/index.html", "./remplates/user.html")
	r.GET("/index", func(context *gin.Context) {
		context.HTML(200, "index.html", gin.H{
			"title": "<a href='www.baidu.com'>hello</a>",
		})
	})

前端:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Title</title>
</head>
<body>
{{.title | safe}}
</body>
</html>

在这里插入图片描述

静态文件处理

如果在模板中引入静态文件,比如样式文件
index.css

	//引入静态文件
	r.Static("/css", "./static/css")

在这里插入图片描述
index.css:

body{
    font-size: 50px;
    color:red;
    background-color: antiquewhite;
}

index.html:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Title</title>
    <link rel="stylesheet" href="/css/index.css">
</head>
<body>
{{.title | safe}}
</body>
</html>

页面:
在这里插入图片描述

会话

会话控制涉及到cookie 和 session的使用

cookie

1、HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出
2、Cookie就是解决HTTP协议无状态的方案之一
3、Cookie实际上就是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求时都会将该信息发送给服务器,服务器收到请求之后,就可以根据该信息处理请求
4、Cookie由服务器创建,并发送给浏览器,最终由浏览器保存

设置cookie

func (c *Context) SetCookie(name,value string,maxAge int,path,domain string,secure,httpOnly bool)

参数说明:
在这里插入图片描述

	//cookie
	r.GET("/cookies", func(context *gin.Context) {
		context.SetCookie("site_cookie", "cookievalue", 3600, "/", "localhost", false, true)
		
	})

在这里插入图片描述
这样就成功设置好了cookie

读取cookie

	//read cookie
	r.GET("/read", func(context *gin.Context) {
		//根据cookie名字读取cookie值
		data, err := context.Cookie("site_cookie")
		if err != nil {
			//返回cookie值
			context.String(200, "not found")
			return
		}

		context.String(200, data)
	})

在这里插入图片描述

删除cookie

通过将cookie的MaxAge设置为-1,就能达到删除cookie的目的

	//delete cookie
	
	r.GET("/del", func(context *gin.Context) {
		context.SetCookie("site_cookie", "cookievalue", -1, "/", "localhost", false, true)

	})

在这里插入图片描述
可以发现先前设置的cookie已经被删除了

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

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

相关文章

全志V3S嵌入式驱动开发(驱动开发准备)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像&#xff0c;直到现在才进入驱动开发的主题。毕竟整个专栏的目的&…

Python 基础(十四):类和对象

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、面向对象编程二、创建类三、创建实例3.1、访问属性3.2、调用方法 四、属性默认值4…

网络通信协议-ICMP协议

目录 一、ICMP协议 二、ICMP协议通信过程 &#xff08;1&#xff09;机制 &#xff08;2&#xff09;原理 &#xff08;3&#xff09;相关术语 丢包率 网络延时率&#xff08;延迟&#xff09; 请求超时【类似表白对方压根不搭理你】 没有任何回复数据&#xff0c;回复…

DNS/ICMP协议/NAT技术

本博文分享DNS&#xff08;简单认识&#xff09;、ICMP&#xff08;简单认识&#xff09;和NAT技术&#xff08;重点学习&#xff09;。 DNS DNS是一整套从域名映射到IP的系统&#xff0c;TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆&…

windows下mysql中binlog日志分析和数据恢复

1.首先查看是否开启了binlog show variables like %log_bin%;看到了是没有开启的。 2.开启binlog日志&#xff0c;并重启mysql服务 不能通过命令的方式去打开&#xff0c;因为会提示说这个参数是只读的。如下图&#xff1a; 所以&#xff0c;打开mysql的配置文件&#xff…

Three.js--》实现3d地球模型展示

目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多…

配置MIT6.S081环境

配置环境 1实现环境2更换源3.安装RISC-V交叉编译工具4.安装QEMU5.检测安装6.下载源码7.检查调试工具8.安装vim9.进行初步调试 1实现环境 虚拟机&#xff08;我用的VMware Workstation Pro&#xff09;Ubantu20.04安装QEMU 注意必须使用ubuntu20.04版本&#xff0c;因为后面安装…

Webpack打包图片-JS-Vue

1 Webpack打包图片 2 Webpack打包JS代码 3 Babel和babel-loader 5 resolve模块解析 4 Webpack打包Vue webpack5打包 的过程&#xff1a; 在webpack的配置文件里面编写rules&#xff0c;type类型有多种&#xff0c;每个都有自己的作用&#xff0c;想要把小内存的图片转成bas…

华为OD机试之不含101的整数(Java源码)

不含101的数 题目描述 小明在学习二进制时&#xff0c;发现了一类不含 101的数&#xff0c;也就是&#xff1a; 将数字用二进制表示&#xff0c;不能出现 101 。 现在给定一个整数区间 [l,r] &#xff0c;请问这个区间包含了多少个二进制不含 101 的整数&#xff1f; 输入描述…

WalkRE--刷图流程(超具体)

1、打开WalkRE软件&#xff0c;界面如下&#xff1a; 2、选择“根据模板新建工程”。操作如下&#xff1a; 3、导入数据。需要入准备好的dxf格式的CAD地形数据。操作如下&#xff1a; 在空白处右键&#xff0c;先关闭所有层&#xff08;大部分层在刷图时用不上&#xff0c;仅打…

自动化测试2:selenium常用API

目录 1.webdirver API 1.1.定位元素 1.2CSS 1.语法 2,使用 1.3XPath定位 1.语法 2.使用 2.操作测试对象 2.1.鼠标点击与键盘输入 2.2submit 提交表单 2.3text 获取元素文本 3.添加等待 3.1.sleep休眠 3.2.智能等待 3.2.1.隐式等待 3.2.2显示等待 4.打印信息 …

web前端 --- CSS(04) -- 盒子模型、div+css网页布局、css3新特性

盒子模型 &#xff08;1&#xff09;网页标签分类&#xff1a; 行内元素&#xff1a;块级元素&#xff1a;有宽高&#xff0c;可以设置大小&#xff0c;同时不会让其他块元素默认占据当前行 &#xff08;2&#xff09;内边距&#xff1a; 内容和边线之间存在空白区域&#x…

路径规划算法:基于猫群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于猫群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于猫群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法猫群…

数据库基础——3.SQL概述及规范

这篇文章我们来讲一下SQL概述和使用规范 目录 1.SQL概述 1.1SQL背景 1.2 SQL语言排行榜 1.3 SQL分类 2.SQL规则与规范 2.1基本规则 2.2 SQL大小写规范 &#xff08;建议遵守&#xff09; 2.3 注 释 2.4 命名规则&#xff08;暂时了解&#xff09; 2.5 数据导入指令 1…

【硬件】嵌入式电子设计基础之数字电路

数字电路与模拟电路的设计思想和应用方法有许多不同之处。 计算器是一个典型的由数字电路实现的电子设备&#xff0c;用户通过数字或符号摁键输入运算式&#xff0c;计算器经过运算之后把结果显示在屏幕上。现代数学电子学始于1946年&#xff0c;其标志是一台以电子管为核心器件…

奥地利博士联培申请签证经验(奥地利签证)

记录一下奥地利申请签证经验&#xff0c;供有需要的小伙伴借鉴&#xff1a; 我申请的是去克拉根福大学联合培养一年&#xff0c;正常的居留签证需要半年之久&#xff0c;但是如果有托管协议&#xff08;Hosting Agreement&#xff09;可以先申请D类签证&#xff0c;抵达奥地利再…

Shell脚本攻略:循环语句for

目录 一、理论 1.for循环 二、实验 1.实验一 2.实验二 3.实验三 4.实验四 5.实验五 6.实验六 7.实验七 一、理论 1.for循环 &#xff08;1&#xff09;for循环的常见三种用法 Ubuntu系统在6.10版本后默认使用dash环境&#xff1b; 而CentOS系统常见默认使用的是ba…

00后是真卷不过,工作没两年,跳槽到我们公司起薪22K都快接近我了

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

C++搜索二叉树

一、搜索二叉树概念 搜索二叉树是一种树形结构&#xff0c;常用于map当中。搜索二叉树严格遵守左小右大的规则 C语言中实现搜索二叉树有一些困难&#xff0c;并且在面对一些特定题目实现较困难。因此采用C的方式再次实现搜索二叉树 二、搜索二叉树的实现 插入 搜索二叉树在…

ASEMI代理长电可控硅BT136参数,BT136规格,BT136说明

编辑-Z 长电可控硅BT136参数&#xff1a; 型号&#xff1a;BT136 RMS通态电流IT(RMS)&#xff1a;6A 非重复浪涌峰值导通电流ITSM&#xff1a;25A 峰值栅极电流IGM&#xff1a;2A 平均栅极功耗PG(AV)&#xff1a;0.5W 存储接点温度范围Tstg&#xff1a;-40 to 150℃ 工…