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

news/2024/11/25 23:51:49/

前言

书接上回,在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 Usercontext.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 Usercontext.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.Valuefiles := form.Filefor _, 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)

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

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

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

读取cookie

	//read cookier.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 cookier.GET("/del", func(context *gin.Context) {context.SetCookie("site_cookie", "cookievalue", -1, "/", "localhost", false, true)})

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


http://www.ppmy.cn/news/95396.html

相关文章

mysql 主从同步

① 修改 master 配置文件② 新建同步账号③ 创建数据库④ 修改 slave 配置文件⑤ 配置主从关系⑥ 检验主从结果 角色ipmaster192.168.233.100slave1192.168.233.101slave2192.168.233.102 禁用 selinux 跟 firewal l情况下&#xff1a; ① 修改 master 配置文件 vim /etc/my…

隐藏在背后的真相——数据存储的方式(上)

数据存储的方式 1. 数据类型详细介绍1.1类型的基本归 2. 整形在内存中的存储2.1原码&#xff0c;反码&#xff0c;补码2.2有符号&#xff08;unsigned&#xff09;和无符号&#xff08;signed&#xff09;2.3 例题 3. 大小端字节序介绍及判断 所属专栏&#xff1a;C语言❤️ &a…

算法基础学习笔记——⑪拓扑排序\最短路

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨拓扑排序 &#x1f353;朴素dijkstra算法&#xff1a; &#x1f353;堆优化版dijkstra : &#x1f353;Bellman-Ford算法 &#x1f353;spfa 算法&#xff08;队列优化的Bellman-Ford算法&#xff09; …

小兔鲜--项目总结3

目录 结算模块-地址切换交互实现 地址切换交互需求分析 打开弹框交互实现 地址激活交互实现 订单模块-生成订单功能实现 支付模块-实现支付功能 支付业务流程 支付模块-支付结果展示 支付模块-封装倒计时函数 理解需求 实现思路分析 会员中心-个人中心信息渲染 分页…

WPF 页面布局 DockPanel Grid StackPanel UniformGrid WrapPanel WPF布局入门 WPF布局资料

在布局常用的布局属性 HorizontalAlignment: 用于设置元素的水平位置VerticalAlignment: 用于设置元素的垂直位置 Margin: 指定元素与容器的边距 Height: 指定元素的高度 Width: 指定素的宽度 WinHeight/WinWidth: 指定元素的最小高度和宽度MaxHeight/MaxWidth: 指定元素的最大…

【脚本工具】SVG路径中的A指令转DXF的圆弧和椭圆弧 C++代码实现

文章目录 一、SVG路径的A指令的语法说明二、DXF中的圆弧和椭圆弧对象2.1 圆弧对象2.2 椭圆弧对象 三、转DXF圆弧3.1 数学公式3.2 代码实现3.3 转换效果展示 四、转DXF椭圆弧4.1 数学公式4.2 代码实现4.3 转换效果展示 一、SVG路径的A指令的语法说明 目前Svg的Arc的参数字符串如…

Android | Android OS 源码结构

参考&#xff1a;AndroidXRef (http://androidxref.com/)版本&#xff1a;Pie - 9.0.0_r3 整体结构 对于 Android OS 的源码目录来说&#xff0c;各个版本的结构大同小异&#xff0c;随不同版本特性会有个别目录差异。编译后会额外产生一个 out 文件夹用于存储编译产生的文件。…

Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)

1、Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1、Zookeeper工作机制 Zookeeper从设置模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责储存和管理大家都关心的数…