golang语言系列:Web框架+路由 之 Gin
云原生学习路线导航页(持续更新中)
本文是golang语言学习系列,本篇对Gin框架的基本使用方法进行学习
1.Gin框架是什么
- Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者
- Gin 最擅长的就是 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用 Gin
- Gin 的官网:https://gin-gonic.com/zh-cn/
- Gin 官方文档地址:https://gin-gonic.com/zh-cn/docs/
- 有中文文档,可以直接看文档学习
- Github 地址:https://github.com/gin-gonic/gin
2.Gin框架快速入门
2.1.快速入门
- 有一篇博客写的非常详细,直接看这个入门就行
- Golang gin框架
- 按照上面博客学习过程中,可能遇到的疑问,写在 2.2 中
2.2.学习上面博客可能遇到的问题
2.2.1.Json和JsonP的区别
- JSON(JavaScript Object Notation)和JSONP(JSON with Padding)是两种用于在网络上传输数据的格式,二者区别如下。
- JSON(JavaScript Object Notation)
- JSON 是一种数据格式,用于在不同的系统之间传输数据。
- JSON 是纯文本,易于阅读和编写,也易于解析和生成。
- JSON 数据可以表示为对象、数组、字符串、数字、布尔值和 null。
- JSON 数据格式不支持跨域请求。
- JSONP(JSON with Padding)
- JSONP 是 JSON 的一种“使用模式”,用于解决跨域请求的问题。
- JSONP 实际上是在 JSON 数据周围包裹了一个函数调用,这个函数名由客户端指定。
- JSONP的请求,客户端需要在url后使用
?
指定一个callback
查询参数 - 因此,在上面的博客中,jsonp请求的响应,会被客户端传入的callback包裹起来,形成callback调用
- JSONP的请求,客户端需要在url后使用
- JSONP 的工作原理是通过动态创建
<script>
标签,将请求发送到另一个域上的 JSONP 服务端点,并且该服务端点返回的数据已经包含在了指定的函数调用中。 - JSONP 允许在不同域之间进行数据交换,绕过了浏览器的同源策略限制。
- 总结
- JSON 是一种数据格式,而 JSONP 则是使用 JSON 数据进行跨域请求的一种技术
- JSONP 通常用于处理由浏览器的同源策略引起的限制,允许在不同域之间进行数据交换
2.2.2.HTML模板渲染讲的不清楚
- html渲染,上面博客说的不清楚,建议看官方文档:
- https://gin-gonic.com/zh-cn/docs/examples/html-rendering/
2.2.3.请求参数绑定结构体重点
-
标记的使用
url后使用?传递的查询参数
、请求体为"user=123&password=456"这种格式的body
,需要结构体设置 form 才可以使用 gin 的自动绑定type Userinfo struct {Username string `form:"user"`Password string `form:"password"` }
- 不过现在的post请求,请求体为 “application/json”,结构体设置json标记可选
// 设置json,需要按照json标记来,可以绑定 {"user": "123", "pwd": "456"} type Userinfo struct {Username string `json:"user"`Password string `json:"pwd"` }// 没有设置json,则请求体需要和属性名一致,可以绑定 {"username": "123", "password": "456"} type Userinfo struct {Username string `form:"user"`Password string `form:"pwd"` }
- 路径参数,需要使用uri参数
// 接口可以是 */:user/:pwd type Userinfo struct {Username string `uri:"user"`Password string `uri:"pwd"` }
- Header 头信息绑定,需要使用header参数
-
gin.Context 的绑定方法使用
- 我们用的最多的绑定方法是
c.ShouldBind()
,可以根据req的Context-Type自动推断要绑定的类型 - 不过 gin.Context 为 很多类型编写了绑定方法,如果你明确知道前端穿过来的数据是什么格式,可以直接使用这些方法
- 可以看到,gin.Context有两个系列方法,Bindxxx和ShouldBindxxx方法,二者区别如下
- Bind 系列方法:
- Bind系列方法在绑定失败时会直接将错误信息发送给客户端,并终止请求处理。
- 这意味着如果绑定失败,客户端将收到一个包含错误信息的响应,并且请求处理将不会继续进行。
- ShouldBind 系列方法:
- ShouldBind系列方法在绑定失败时不会立即将错误信息发送给客户端,而是将错误信息存储在上下文中。
- 这使得开发者可以根据实际情况自定义错误处理逻辑,例如返回特定的错误响应、记录错误日志等。
- 开发者可以通过检查上下文中的错误信息来判断绑定是否成功,并根据需要采取进一步的行动。
- Bind 系列方法:
- 我们用的最多的绑定方法是
-
更详细的用法,可以学习:
- Gin 框架学习笔记(02)— 参数自动绑定到结构体
- Go学习第十五章——Gin参数绑定bind与验证器
2.2.4.gin.Context.Abort()方法
- gin路由注册时,参数可以填多个中间件+一个处理函数
- 其中参数位置,gin的中间件,必须放在 处理函数 前面
- gin的中间件,使用
c.Next
控制是请求到达时执行,还是请求返回时执行
c.Abort
执行后- 当前中间件的后续语句,还会执行
- 但是
c.Next
失效了,后面的中间件和最后的处理函数,都不会再执行 - 执行完当前中间件,请求就返回了
- 如下面代码,程序会输出
1111111111
和handle time
,但是不会输出2222222222
func CalTimeMiddleWare(c *gin.Context) {start := time.Now()c.Abort()log.Info("1111111111")c.Next()log.Infof("handle time is [%d]", time.Since(start).Nanoseconds()) }func MiddleWare2(c *gin.Context) {log.Info("2222222222") }adminRouter.GET("/users", middleware.CalTimeMiddleWare, middleware.MiddleWare2, controller.NewAdminController().List)
2.2.5.使用gin进行文件上传
- 上面的博客里,没有写gin上传文件的内容
- 可以直接看 官方文档的内容,写的很详细
- 上传单文件:
- https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/
- 上传多文件:
- https://gin-gonic.com/zh-cn/docs/examples/upload-file/multiple-file/
2.2.6.gin获取cookie
- gin.Context.Cookie(“key1”)方法,获取cookie中键为key1的值
- 比如下面,c.Cookie(“key1”) 得到的值就是 value1
curl --location 'http://localhost:8080/admin/users' \ --header 'Cookie: key1=value1; key2=value2'
- go代码写法
v, err := c.Cookie("key1") if err != nil {log.Warnf("don't find cookie in [%s]", c.Request.URL.Path) } c.Set("key1", v)
相关文章:
golang语言系列:Web框架+路由 之 Gin
云原生学习路线导航页(持续更新中) 本文是golang语言学习系列,本篇对Gin框架的基本使用方法进行学习 1.Gin框架是什么 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者…...
春招百题--堆
一、堆的定义 二、堆(优先队列) 堆通常用于实现优先队列(priority_queue),大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看,我们可以将“优先队列”和“堆”看作等价的数据结构。 堆的…...
全志A40i android7.1 移植wifi驱动的一般流程
一,问题分析 一般情况下移植一款模组,会涉及到驱动,firmware, hal层,方案端的适配。 下面以RTL8723ds为例详细列出移植的通用步骤。 二,移植步骤 1. 移植Wi-Fi驱动 从RTL原厂或者已经支持的其他把内核版本中获取驱动…...
Qt——Qt绘图之QPainter的使用总结(使用paintEvent实现旋转图片效果)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...
Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现
目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728) J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …...
【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…...
泰坦尼克号幸存者数据分析
泰坦尼克号幸存者数据分析 1、泰坦尼克号数据集2、数据集加载与概览3、泰坦尼克号幸存者数据分析4、哪些人可能成为幸存者? 1、泰坦尼克号数据集 泰坦尼克号的沉没是世界上最严重的海难事故之一,造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮…...
Memcached 教程之 PHP 连接 Memcached 服务(十)
PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务,接下来我们为大家介绍 PHP 如何使用 Memcached 服务。 PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址:PECL :: Package :: memcache,你可以下载最新稳定…...
【zlm】音视频流与音频流合并的设计
目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…...
typescript的工作流
先coding code.ts代码,由tsc编译code.ts生成code.js格式 npm install —save-dev lite-server 是用来安装轻量级的服务器,只是用来开发的一个服务器,真正到生产环境中时可能会使用类似于Apache的server或者汤姆猫一类的服务器,安…...
MATLAB下载与安装详细教程:从官方获取到成功启动
引言 MATLAB(MATrix LABoratory)作为一款全球知名的高级数值计算与数据分析平台,以其强大的矩阵运算能力、丰富的内置函数库以及直观易用的图形用户界面,深受科研人员、工程师和学生群体的青睐。无论是进行复杂的数学建模、信号处…...
【随笔】Git 高级篇 -- 分离 HEAD(十一)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
mac、windows 电脑安装使用多个版本的node
我们为啥要安装多个不同版本的node? 开发旧项目时,使用低版本Nodejs。开发新项目时,需使用高版本Node.js。可使用n同时安装多个版本Node.js,并切换到指定版本Node.js。 mac电脑安装 一、全局安装 npm install -g n 二、mac电脑…...
vue 浅解watch cli computed props ref vue slot axios nexttick devtools说明使用
Vue.js 是一个强大的前端框架,它提供了很多有用的功能和工具。你提到的这些特性(watch、cli、computed、props、ref、slot、axios、nextTick、devtools)在 Vue 中各自扮演着不同的角色。下面我会逐一解释这些特性如何在 Vue 中使用࿱…...
Unity自定义框架(1)-----------单例模式
前言: Unity作为一款强大的游戏开发引擎,其基础框架的设计对于项目的结构和性能有着重要的影响。其中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 什么是单例模式?…...
04-自媒体文章-自动审核
自媒体文章-自动审核 1)自媒体文章自动审核流程 1 自媒体端发布文章后,开始审核文章 2 审核的主要是审核文章的内容(文本内容和图片) 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片,由于图片存储到minIO中&…...
LeetCode-热题100:763. 划分字母区间
题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。…...
IDEA2023创建SpringMVC项目
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…...
ubuntu-server部署hive-part2-安装hadoop
参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本:ubuntu-server-22.04.3 虚拟机:virtualbox7.0 安装hadoop 下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…...
Python深度学习032:conda操作虚拟环境env的全部命令
文章目录 创建和管理环境环境列表和检查环境的保存与复制更新环境清理 CondaConda 是一个开源的包管理器和环境管理器,可以用于安装、运行和升级包和环境。 使用 Conda,你可以创建、导出、列出、删除和更新环境,这些环境可以包含不同版本的 Python 以及/或软件包。 下面列出…...
使用Java拓展本地开源大模型的网络搜索问答能力
背景 开源大模型通常不具备最新语料的问答能力。因此需要外部插件的拓展,目前主流的langChain框架已经集成了网络搜索的能力。但是作为一个倔强的Java程序员,还是想要用Java去实现。 注册SerpAPI Serpapi 提供了多种搜索引擎的搜索API接口。 访问 Ser…...
Mybatis——一对多关联映射
一对多关联映射 一对多关联映射有两种方式,都用到了collection元素 以购物网站中用户和订单之间的一对多关系为例 collection集合的嵌套结果映射 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import java.util.List;Data public cla…...
Pytorch实用教程:TensorDataset和DataLoader的介绍及用法示例
TensorDataset TensorDataset是PyTorch中torch.utils.data模块的一部分,它包装张量到一个数据集中,并允许对这些张量进行索引,以便能够以批量的方式加载它们。 当你有多个数据源(如特征和标签)时,TensorD…...
uni-app如何实现高性能
这篇文章主要讲解uni-app如何实现高性能的问题? 什么是uni-app? 简单说一下什么是uni-app,uni-app是继承自vue.js,对vue做了轻度定制,并且实现了完整的组件化开发,并且支持多端发布的一种架构,…...
docker 应用部署
参考:docker 构建nginx服务 环境 Redhat 9 步骤: 1、docker部署MySQL 安装yum 工具包 [rootadmin ~]# yum -y install yum-utils.noarch 正在更新 Subscription Management 软件仓库。 无法读取客户身份本系统尚未在权利服务器中注册。可使用 subscription-…...
java.awt.FontFormatException: java.nio.BufferUnderflowException
Font awardFont Font.createFont(Font.TRUETYPE_FONT, awardFontFile).deriveFont(120f).deriveFont(Font.BOLD);使用如上语句创建字体时出现问题。java.awt.FontFormatException: java.nio.BufferUnderflowException异常表明在处理字体数据时出现了缓冲区下溢(Buf…...
C++ 枚举类型 ← 关键字 enum
【知识点:枚举类型】● 枚举类型(enumeration)是 C 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。 ● 枚举元素作为常量,它们是有值的。C 编译时,依序对枚举元素赋整型值 0,1,2,3,…。 下面代…...
MySQL故障排查与优化
一、MySQL故障排查 1.1 故障现象与解决方法 1.1.1 故障1 1.1.2 故障2 1.1.3 故障3 1.1.4 故障4 1.1.5 故障5 1.1.6 故障6 1.1.7 故障7 1.1.8 故障8 1.1.9 MySQL 主从故障排查 二、MySQL优化 2.1 硬件方面 2.2 查询优化 一、MySQL故障排查 1.1 故障现象与解决方…...
如何做一个知识博主? 善用互联网检索
Google 使用引号: 使用双引号将要搜索的短语括起来,以便搜索结果中只包含该短语。例如,搜索 "人工智能" 将只返回包含该短语的页面。 排除词汇: 在搜索中使用减号 "-" 可以排除特定词汇。例如,搜索 "苹果 -手机" 将返回关于苹果公司的结果,但…...
《QT实用小工具·十》本地存储空间大小控件
1、概述 源码放在文章末尾 本地存储空间大小控件,反应电脑存储情况: 可自动加载本地存储设备的总容量/已用容量。进度条显示已用容量。支持所有操作系统。增加U盘或者SD卡到达信号。 下面是demo演示: 项目部分代码如下: #if…...
网站群建设规划方案/推广赚钱app排行榜
首先,一款优秀的移动APP产品原型设计工具应该具备: 支持移动端演示(随时随地演示给BOSS,厕所&食堂&电梯…以体现我是那么的敬业——长点工资必备)组件库(高效复用,谁用谁知道ÿ…...
ASP动态网站开发毕业设计指导及实例/aso关键词优化工具
作者: | 上传时间:2009-11-16 | 关键字:QinQ技术(也称Stacked VLAN 或Double VLAN)是指将用户私网VLAN标签封装在公网VLAN标签中,使报文带着两层VLAN标签穿越运营商的骨干网络,在公网中只根…...
惠州外包网站建设/关键词智能优化排名
访问目录文件夹下的文件是经常需要的操作,C/C和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过MFC的CFileFind函数递归遍历实现,包括以下几个功能函数: 查找目录下所有的文件夹;查找目录下…...
义乌网站制作是什么/网络推广的方式有哪些?
PHP教程 - PHP简介PHP脚本通常以文件扩展名.php保存。声明PHP代码的基本单位称为语句,以分号结尾。通常一行代码只包含一个语句,但我们可以有许多语句在一行上你想要的。PHP打开和关闭代码岛标记了PHP代码岛。短标签版本是。"Hello, world!" ?…...
现在较为常用的网站开发技术/抖音关键词排名查询工具
在平常的开发中,我们经常会遇到JSONObject和Bean的互换,JSONArray和List<Bean>的互换,具体的操作可以看下面的小例子。 1 public class Test2 {3 public static void main(String args[])4 {5 User temp new User();6…...
中国建设招标网是什么网站/抖音seo搜索引擎优化
appium目前最新的windows版本是1.4.16,在android8.0.0真机上测试脚本时会报错:command failed shell “ps ‘uiautomator’”。 刚开始以为错误原因是模拟器系统和真机系统版本没对应上(小菜,所以在猜原因)࿰…...