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

        异步是启动一个协程去执行请求。  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据脱敏学习

数据脱敏是一种保护敏感信息的方法&#xff0c;它通过修改或删除数据中的敏感部分&#xff0c;使得数据在保持一定可用性的同时&#xff0c;不再直接关联到个人隐私或重要信息。 自然人指可以直接或间接标识 直接标识&#xff1a;如姓名、身份证号码、家庭住址、电话号码、电…

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

【proteus 51单片机入门】8*8led点阵

文章目录 前言如何点亮led点阵仿真图代码点亮led核心代码解析 爱心代码 滚动总结 前言 在嵌入式系统的开发中&#xff0c;LED点阵显示器是一种常见的显示设备&#xff0c;它可以用来显示各种图形和文字&#xff0c;为用户提供直观的信息反馈。本文将介绍如何使用Proteus软件和…

Element 页面滚动表头置顶

在开发后台管理系统时&#xff0c;表格是最常用的一个组件&#xff0c;为了看数据方便&#xff0c;时常需要固定表头。 如果页面基本只有一个表格区域&#xff0c;我们可以根据屏幕的高度动态的计算出一个值&#xff0c;给表格设定一个固定高度&#xff0c;这样表头就可以固定…

在 PMP 考试中,项目管理经验不足怎么办?

在项目管理的专业成长之路上&#xff0c;PMP认证如同一块里程碑&#xff0c;标志着从业者的专业水平达到了国际公认的标准。然而&#xff0c;对于那些项目管理经验尚浅的考生来说&#xff0c;这座里程碑似乎显得有些遥不可及。那么&#xff0c;在PMP考试准备中&#xff0c;项目…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

DigiRL:让 AI 自己学会控制手机

类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令&#xff0c;不同的是它利用了离线到在线强化学习&#xff08;Offline-to-Online RL&#xff09;&#xff0c;能够快速适应应用更新或 UI 变化。

如何解决java程序CPU负载过高问题

1、介绍 在生产环境中&#xff0c;有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机&#xff0c;进而中断对外服务&#xff0c;也会影响硬件寿命。 2、原因 1、Java代码存在因递归不当等原因导致的死循环的问题&#xff0c;推荐有条件的循环&#xf…

OpenAI禁止中国使用API,国内大模型市场何去何从

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; 前言 前言&#xff1a; 近日&#xff0c;OpenAI宣布禁止中国用户使用其API&#xff0c;这一决策引起了国内大模型市场的广泛关注。面对这一挑战&#xff0c;国内大模型市场的发展路径和前景成为业界热议的焦点。本…

pytorch-01

加载mnist数据集 one-hot编码实现 import numpy as np import torch x_train np.load("../dataset/mnist/x_train.npy") # 从网站提前下载数据集&#xff0c;并解压缩 y_train_label np.load("../dataset/mnist/y_train_label.npy") x torch.tensor(y…

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码

猜拳游戏大转盘积分游戏小程序前端模板源码&#xff0c; 一共五个静态页面&#xff0c;首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分&#xff0c;积分可以兑换商品&#xff0c;也可用来玩游戏&#xff1b;通过玩游戏既可能获取奖品或积分也可能会消…

一文速览Google的Gemma:从gemma1到gemma2(2代27B的能力接近llama3 70B)

前言 如此文《七月论文审稿GPT第3.2版和第3.5版&#xff1a;通过paper-review数据集分别微调Mistral、gemma》所讲 Google作为曾经的AI老大&#xff0c;我司自然紧密关注&#xff0c;所以当Google总算开源了一个gemma 7b&#xff0c;作为有技术追求、技术信仰的我司&#xff0…

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…

关于组织赴俄罗斯(莫斯科)第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知

关于组织赴俄罗斯&#xff08;莫斯科&#xff09; 第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知 展会名称&#xff1a;俄罗斯&#xff08;莫斯科&#xff09;第 28 届国际汽车零部件、汽车零部件、汽车维修设备和商品展览会 时间&#xff1a;2024 年 8 月…

day02-Spark集群及参数

一、Spark运行环境变量问题(了解) 1-pycharm远程开发运行时&#xff0c;执行的是服务器的代码 2-通过本地传递指令到远程服务器运行代码时&#xff0c;会加载对应环境变量数据&#xff0c;加载环境变量文件是用户目录下的.bashrc文件 在/etc/bashrc 1-1 在代码中添加 使用os模块…

文本编辑命令和正则表达式

一、 编辑文本的命令 正则表达式匹配的是文本内容&#xff0c;Linux的文本三剑客&#xff0c;都是针对文本内容。 文本三剑客 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 &#xff08;本文不相关&#xff09; awk&#xff1a;按行取列 &#x…

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

element 问题整合

没关系&#xff0c;凡事发生必有利于我 文章目录 一、el-table 同级数据对齐及展开图标的位置问题二、el-table 勾选框为圆角及只能勾选一个三、el-tree 弹框打开&#xff0c;使得列表关闭&#xff0c;且弹框滚动条回到顶部 一、el-table 同级数据对齐及展开图标的位置问题 ele…

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率&#xff0c;在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈&#xff0c;在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL/WebEngine支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库 目录 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库写在前面前期准备编译全流程1. 环境搭建2. 复制源码包并解压&#xff0c;创…