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

前言

书接上回,在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已经被删除了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中&#xff0c;IPAM&#xff08;IP Address Management&#xff09;是一种用于管理IP地址和DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…

奇偶分频电路

目录 偶数分频 寄存器级联法 计数器法 奇数分频 不满足50%占空比 50%占空比 偶数分频 寄存器级联法 寄存器级联法能实现2^N的偶数分频&#xff0c;具体做法是采用寄存器结构的电路&#xff0c;每当时钟上升沿到来的时候对输出结果进行翻转&#xff0c;以此来实现偶数分…

chatgpt赋能python:Python中日期转换:从字符串到日期对象

Python中日期转换&#xff1a;从字符串到日期对象 作为一个经验丰富的Python工程师&#xff0c;日期转换在我的日常编码工作中经常遇到。Python提供了一些内置函数和模块&#xff0c;可以将字符串转换为日期对象或将日期对象格式化为特定的字符串。本篇文章将带您深入了解Pyth…

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

【计算思维题】少儿编程 蓝桥杯青少组计算思维真题及详细解析第6套

少儿编程 蓝桥杯青少组计算思维真题及详细解析第6套 1、兰兰有一些数字卡片,从 1 到 100 的数字都有,她拿出几张数字卡片按照一定顺序摆放。想一想,第 5 张卡片应该是 A、11 B、12 C、13 D、14 答案:C 考点分析:主要考查小朋友们的观察能力和数学推理能力,从给定的图…

交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式

交换机是计算机网络中重要的网络设备之一&#xff0c;用于实现局域网&#xff08;LAN&#xff09;内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式&#xff1a;级联方式、堆叠方式、端口聚合方…

特瑞仕|关于无线射频

无线射频&#xff08;Radio Frequency, RF&#xff09;是指在一定频率范围内&#xff0c;通过无线电波进行通信和传输信息的技术。随着移动通信、物联网、智能家居等领域的不断发展&#xff0c;无线射频技术已经成为现代社会中不可或缺的一部分。本文将从以下几个方面对无线射频…

230530-论文整理-课题组2

对这些研究有点兴趣颇微。 文章目录 Rethinking Dense Retrieval’s Few-Shot AbilityDecoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-DecoderPLOME: Pre-training with Misspelled Knowledge for Chinese Spelling CorrectionRead…

一般小型企业,一个CRM系统要多少钱?都有哪些功能?

客户关系管理crm多少钱一套&#xff1f; 不同CRM要价不同&#xff0c;甚至同一款CRM产品在不同客户方部署下来的价格也是有差别的。 这篇给大家分享几款可实操的CRM管理软件的价位&#xff0c;有需要的可以做以参考&#xff01; 一、简道云CRM管理系统 模版地址&#xff1a;…

《开箱元宇宙》爱心熊通过 The Sandbox 与粉丝建立更紧密的联系

你们有没有想过 The Sandbox 如何融入世界上最具标志性的品牌和名人的战略&#xff1f;在本期《开箱元宇宙》系列中&#xff0c;我们与 Cloudco Entertainment 的数字内容顾问 Derek Roberto 聊天&#xff0c;了解为什么爱心熊决定在 The Sandbox 中试验 web3&#xff0c;以及他…

day1 - OpenCV安装与环境配置

本期我们介绍 OpenCV 的背景知识以及如何安装 OpenCV 。 完成本期内容&#xff0c;你可以&#xff1a; 了解 OpenCV 的背景知识掌握安装 OpenCV 及其拓展库 若要运行案例代码&#xff0c;你需要有&#xff1a; 操作系统&#xff1a;Ubuntu 16 以上 或者 Windows10 工具软件…

红米8a,刷机到安卓调用之路

什么是BL锁&#xff1f; https://baijiahao.baidu.com/s?id1614459630284912892&wfrspider&forpc bl锁简单来说&#xff0c;就是厂商为了自己的目的&#xff0c;为了避免刷机&#xff0c;而人为设置的一道障碍&#xff0c;我的第一步就需要等待168小时&#xff0c;经…

车载ECU休眠唤醒-TJA1145

前言 首先&#xff0c;请教大家几个小小问题&#xff0c;你清楚&#xff1a; 什么是TJA1145吗&#xff1f;你知道休眠唤醒控制基本逻辑是怎么样的吗&#xff1f;TJA1145又是如何控制ECU进行休眠唤醒的呢&#xff1f;使用TJA1145时有哪些注意事项呢&#xff1f; 今天&#xff…

Java学习笔记20——内部类

内部类 内部类的访问特点内部类的形式成员内部类局部内部类匿名内部类匿名内部类在开发中使用 内部类是类中的类 内部类的访问特点 1.内部类可以直接访问外部类的成员&#xff0c;包括私有成员 2.外部要访问内部类的成员&#xff0c;必须创建对象 内部类的形式 成员内部类 …

IMX6ULL平台的I2C

IMX6ULL平台的I2C 文章目录 IMX6ULL平台的I2C概述模式和操作 外部信号时钟功能描述I2C系统配置仲裁程序时钟同步信号交换外围总线访问复位中断字节顺序 初始化初始化序列启动的生成传输后软件响应停止的生成重复启动的生成从模式仲裁失败软件限制 I2C内存映射/寄存器定义I2C地址…

Windows操作系统的文件组织结构和计算方法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows操作系统的文件组织结构和计算方法。 这是一块非常实用的知识&#xff0c;感谢大家来看这个帖子。 Windows组织结构就是文件的组织形式&#xff0c;其中&#xff1a; 1.Windows逻辑结构…

FL Studio水果软件好用吗?对电脑硬件环境有哪些需求

如果你打算将来朝着艺术和音乐方向发展&#xff0c;那么学习音乐理论和音乐制作就是一门基础课了。 实践才是检验学习效果途径&#xff0c;在我们日常的练习中&#xff0c;一款功能强大且易学的音乐制作工具是少不了的。在没有实际体验过各个音乐制作工具的功能前&#xff0c;…

OpenHarmony3.1安全子系统-签名系统分析

介绍 应用签名系统主要负责鸿蒙hap应用包的签名完整性校验&#xff0c;以及应用来源识别等功能。 子系统间接口&#xff1a; 应用完整性校验模块给其他模块提供的接口&#xff1b;完整性校验&#xff1a; 通过验签&#xff0c;保障应用包完整性&#xff0c;防篡改&#xff1b;…

互联网中的web3.0和gpt有何联系?

文章目录 ⭐前言⭐web 3.0&#x1f496; web1.0-web3.0的概念 ⭐chatgpt&#x1f496; gpt的概念 ⭐总结⭐结尾 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享互联网中的web3.0和gpt的关系。 互联网的发展 第一台计算机的出现 世界上第一台通用计算机“ENIAC”于…