gin数据解析,绑定和渲染
一. 数据解析和绑定
1.1 Json数据解析和绑定
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="/loginForm" method="post"enctype="application/x-www-form-urlencoded">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
代码:
- gin.Context中的ShouldBind方法将请求中的正文中的数据,自动按照json格式解析到结构体。
package mainimport ("net/http""github.com/gin-gonic/gin"
)// 定义接收数据的结构体
type Login struct {//binding:"required"修饰字段,若接收为空值,则报错Account string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`Passwd string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {//创建路由r := gin.Default()//设置HTML文件所在目录r.LoadHTMLGlob("./*.html")r.GET("/", func(c *gin.Context) {//发送html文件内容c.HTML(http.StatusOK, "index.html", nil)})r.POST("/loginForm", func(c *gin.Context) {//声明接收变量var json Login//将request的body中的数据,自动按照json格式解析到结构体if err := c.ShouldBindJson(&json); err != nil {//gin.H封装了生成json数据工具c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return}//判断用户名密码是否正确if json.Account != "root" || json.Passwd != "admin" {c.JSON(http.StatusBadRequest, gin.H{"status": ".304",})return}c.JSON(http.StatusOK, gin.H{"status": "ok",})})r.Run()
}
演示:

1.2. 表单数据解析和绑定
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="/loginForm" method="post"enctype="application/x-www-form-urlencoded">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
代码:
- gin.Context的Bind方法默认解析并绑定form格式,根据请求头中的content-type自动推断。
package mainimport ("net/http""github.com/gin-gonic/gin"
)// 定义接收数据的结构体
type Login struct {//binding:"required"修饰字段,若接收为空值,则报错Account string `form:"username" binding:"required"`Passwd string `form:"password" binding:"required"`
}func main() {//创建路由r := gin.Default()//设置HTML文件所在目录r.LoadHTMLGlob("./*.html")r.GET("/", func(c *gin.Context) {//发送html文件内容c.HTML(http.StatusOK, "index.html", nil)})r.POST("/loginForm", func(c *gin.Context) {//声明接收变量var form Login//Bind()默认解析并绑定form格式//根据请求头中的content-type自动推断if err := c.Bind(&form); err != nil {//gin.H封装了生成json数据工具c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return}//判断用户名密码是否正确if form.Account != "root" || form.Passwd != "admin" {c.JSON(http.StatusBadRequest, gin.H{"status": ".304",})return}c.JSON(http.StatusOK, gin.H{"status": "ok",})})r.Run()
}
1.3. URI数据解析和绑定
- gin.Context中的ShouldBindUri方法将uri中的数据,自动按照uri格式解析到结构体。
package mainimport ("net/http""github.com/gin-gonic/gin"
)// 定义接收数据的结构体
type Login struct {//binding:"required"修饰字段,若接收为空值,则报错Account string `uri:"user" binding:"required"`Passwd string `uri:"password" binding:"required"`
}func main() {//创建路由r := gin.Default()r.GET("/:user/:password", func(c *gin.Context) {//声明接收变量var uri Loginif err := c.ShouldBindUri(&uri); err != nil {//gin.H封装了生成json数据工具c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return}//判断用户名密码是否正确if uri.Account != "root" || uri.Passwd != "admin" {c.JSON(http.StatusBadRequest, gin.H{"status": ".304",})return}c.JSON(http.StatusOK, gin.H{"status": "ok",})})r.Run()
}
演示:


二. gin渲染
2.1 各种数据的响应
多种响应方式:
package mainimport ("net/http""github.com/gin-gonic/gin""github.com/gin-gonic/gin/testdata/protoexample"
)func main() {r := gin.Default()//1. jsonr.GET("/someJson", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "someJson","status": "ok",})})//2. 结构体响应r.GET("/someStruct", func(c *gin.Context) {var msg struct {Name stringMessage stringNumber int}msg.Name = "root"msg.Message = "someStruct"msg.Number = 1c.JSON(http.StatusOK, msg)})//3. xmlr.GET("/someXml", func(c *gin.Context) {c.XML(http.StatusOK, gin.H{"message": "abc"})})//4. YAML响应r.GET("/someYaml", func(c *gin.Context) {c.YAML(http.StatusOK, gin.H{"message": "123",})})//5. protobuf格式//构建一个自己的传输格式r.GET("/someProtobuf", func(c *gin.Context) {resp := []int64{int64(1), int64(2)}lable := "lable"data := &protoexample.Test{Label: &lable,Reps: resp,}c.ProtoBuf(http.StatusOK, data)})r.Run()
}
2.2 HTML模板渲染
- gin支持加载HTML模板,然后根据模板进行配置并返回相应的数据,本质就是字符串替换。
- LoadHTMLGlob()方法可以加载模板文件
目录结构:

html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{{.title}}</title>
</head>
<body>
fgkjdskjdsh{{.ce}}
</body>
</html>
代码:
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("./tem/*") //从运行文件位置开始 需要加载的html文件路径r.GET("/someHtml", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})r.Run()
}
- 当html的目录结构如下时

html:
{{ define "user/index.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{.title}}</title>
</head><body>fgkjdskjdsh{{.message}}</body>
</html>
{{ end }}
代码:
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("tem/*/*") //从运行文件位置开始 需要加载的html文件路径r.GET("/someHtml", func(c *gin.Context) {//user/index.html为html中的definec.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是测试", "message": "123"})})r.Run()
}
演示:

- html头尾分离

代码:
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("tem/*/*") //从运行文件位置开始 需要加载的html文件路径r.GET("/someHtml", func(c *gin.Context) {//user/index.html为html中的definec.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是测试", "message": "123"})})r.Run()
}
演示:

- 如果你需要引入静态文件需要定义一个静态文件目录
r.Static("./assets", "./assets")
2.3 重定向
- 使用gin.Context的Redirect方法
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/index", func(c *gin.Context) {//重定向c.Redirect(http.StatusMovedPermanently, "redirect")})r.GET("/redirect", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "hello",})})r.Run()
}

2.4 同步异步
- goroutine机制可以方便地实现异步处理
- 另外,在启动新的goroutine时,不应该使用原始上下文context,必须使用它的只读副本
package mainimport ("log""time""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/long_async", func(c *gin.Context) {//上下文副本c_tmp := c.Copy()//异步处理go func() {time.Sleep(2 * time.Second)log.Println("异步执行 " + c_tmp.Request.URL.Path)}()})r.GET("/long_sync", func(c *gin.Context) {time.Sleep(3 * time.Second)log.Println("同步执行 " + c.Request.URL.Path)})r.Run()
}
异步是启动一个协程去执行请求。

相关文章:
gin数据解析,绑定和渲染
一. 数据解析和绑定 1.1 Json数据解析和绑定 html文件: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...
Django 对模型创建的两表插入数据
1,添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …...
Lua: 轻量级多用途脚本语言
Lua 是一种高效而轻量级的脚本语言,具备强大的扩展性和灵活性,广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初,…...
PotPlayer安装及高分辨率设置
第1步: 下载安装PotPlayer软件 PotPlayer链接:https://pan.baidu.com/s/1hW168dJrLBonUnpLI6F3qQ 提取码:z8xd 第2步: 下载插件,选择系统对应的位数进行运行,该文件不能删除,删除后将失效。 …...
实现写入缓存策略的最佳方法探讨
实现写入缓存策略的最佳方法探讨 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在软件开发中实现写入缓存策略的最佳方法。缓存在提升应用性能和…...
【Day03】0基础微信小程序入门-学习笔记
文章目录 视图与逻辑学习目标页面导航1. 声明式导航2. 编程式导航3. 导航传参 页面事件1. 下拉刷新2. 上拉触底3.扩展-自定义编译模式 生命周期1. 简介2. 生命周期函数3. 应用的生命周期函数4. 页面生命周期函数 WXS脚本1. 概述2. 基础语法3. WXS的特点4. 使用WXS处理手机号 总…...
libctk shared library的设计及编码实践记录
一、引言 1.1 <libctk>的由来 1.2 <libctk>的设计理论依据 1.3 <libctk>的设计理念 二、<libctk>的依赖库 三、<libctk>的目录说明 四、<libctk>的功能模块及使用实例说明 4.1 日志模块 4.2 mysql client模块 4.3 ftp client模块 4…...
【代码随想录训练营】【Day 65】【图论-2】| 卡码 99
【代码随想录训练营】【Day 65】【图论-2】| 卡码 99 需强化知识点 深度搜索和广度搜索 题目 99. 岛屿数量 思想:遍历到为1的节点,再搜索标记,每遇到新的陆地节点,增加计数 深度搜索广度搜索:此处用 [] 作为待遍…...
【动态规划】139. 单词拆分
139. 单词拆分 难度:中等 力扣地址:https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字…...
【C++】空指针访问成员函数
空指针访问成员函数 C中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针 如果用到this指针,需要加以判断保证代码的健壮性 class Animal { public:void fun1() {//正常的成员函数}void fun2() {if (this NULL) {return;//如果没有这个…...
Linux的IO易错点总结
本文主要记录IO的一些易错操作。 阻塞IO和非阻塞IO,一般都是针对数据读取的,因为write是主动行为,不存在阻塞这一说。 非阻塞式IO,一般都要配合while轮询来读取数据。 IO多路复用 当只检测一路IO的时候,和普通IO的作…...
【Android面试八股文】说一说你对Android中的Context的理解吧
文章目录 一、Context是什么?1.1 主要功能和用途1.2 如何获取 Context 实例?1.3 注意事项二、Context 类的层次结构三、Context的数量四、Context的注意事项五、Android 中有多少类型的 Context,它们有什么区别 ?六、Contextlmpl实例是什么时候生成的,在 Activity 的 oncr…...
AI在音乐创作中的角色:创造还是毁灭?
目录 一、基本情况介绍 二、近期新闻 三、AI生成音乐方面的商业模式 四、人工智能和音乐人可能的合作模式 五、人们如何借助AI来创作音乐 六、人工智能在创意产业引发的伦理道德问题 七、如何平衡技术发展与提高人类创造积极性的关系? 总结 一、基本情况介绍…...
[深入理解DDR] 总目录
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门,点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存?内存与存…...
模板方法模式在金融业务中的应用及其框架实现
引言 模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的框架,而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中ÿ…...
leetcode347.前k个高频元素
leetcode347.前k个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 优先队列法 struct hash_…...
c++(二)
1. 类和对象 1.1. 封装 封装的意义 将属性和行为作为一个整体,表现生活中的事物;将属性和行为加以权限控制 public -> 公共权限:类内可以访问,类外也可以访问protected -> 保护权限:类内可以访问,…...
基于PHP的初中数学题库管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的初中数学题库管理系统 一 介绍 此初中数学题库管理系统基于原生PHP开发,数据库mysql,系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 …...
WDG看门狗
1 WDG 1.1 简介 WDG是看门狗定时器(Watchdog Timer)的缩写,它是一种用于计算机和嵌入式系统中的定时器,用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗,它时刻盯着你的程序,确保它们正常运行。…...
zabbix server client 安装配置
Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.0.3 源码安装 Zabbix Agent 6.0.3 源码安装 MySQL 8.0.28 yum安装 Nginx 1.20…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
