Gin框架---基础综述
目录
- 一:经典入门案例
- 二:请求参数
- 2.1: API参数
- 2.2: URL参数
- 2.3: 表单参数
- 三: 响应参数
- 四:数据解析和绑定
- 4.1: JSON数据解析绑定
- 4.2: FROM表单数据解析和绑定
- 五: 路由组
- 六:异步处理
- 七:中间件
- 7.1: 全局中间件
- 7.2: 局部中间件
一:经典入门案例
- 代码:
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 2: 编写路由处理函数r.GET("/hello", func(context *gin.Context) {context.String(http.StatusOK, "hello world!!!")})// 3: 路由监听端口r.Run(":8080") } - 请求:

二:请求参数
2.1: API参数
- API参数: 参数写在路径中。
- 注意:
- 1: 一般用冒号 + 路径参数名称来划分。 冒号的作用是可以让Param方法取到后面的数据。
- 2: 如果是用星号 + 路径名称,则获取到的是包含路径斜杠+后续的所有内容的。
- 案例一:
package mainimport ("github.com/gin-gonic/gin""net/http")func main() {// 1:实例化默认路由r := gin.Default()// 2: 编写路由处理函数r.GET("/user/:name/:action", func(context *gin.Context) {name := context.Param("name")action := context.Param("action")context.String(http.StatusOK, "name is "+name+", action is "+action+"。")})// 3: 路由监听端口r.Run(":8080")}``` - 结果, 发送请求:http://127.0.0.1:8080/user/renshanwen/reading

- 案例二:
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 2: 编写路由处理函数r.GET("/user/*name_action", func(context *gin.Context) {nameAction := context.Param("name_action")context.String(http.StatusOK, "name_action is "+nameAction)})// 3: 路由监听端口r.Run(":8080") }

2.2: URL参数
- URL参数:参数写在请求k-v对中。
- 使用Query()函数获取参数信息, 获取不到默认获取到空字符串。
- 案例
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 2: 编写路由处理函数r.GET("/user", func(context *gin.Context) {name := context.Query("name")age := context.Query("age")context.String(http.StatusOK, "name is "+name+" age is "+age+".")})// 3: 路由监听端口r.Run(":8080") }

2.3: 表单参数
- POST请求中的信息, 一般是JSON数据。
- 使用PostForm函数在表单中获取数据。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 2: 编写路由处理函数r.POST("/user", func(context *gin.Context) {name := context.PostForm("name")age := context.PostForm("age")context.String(http.StatusOK, "name is "+name+" age is "+age+".")})// 3: 路由监听端口r.Run(":8080") }

- 解析JSON数据
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http""strconv" )func main() {// 1:实例化默认路由r := gin.Default()// 定义一个User结构体type User struct {Name string `json:"name"`Age int64 `json:"age"`}// 2: 编写路由处理函数r.POST("/user", func(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中context.BindJSON(&reqData)// 构造响应context.String(http.StatusOK, "name is "+reqData.Name+" age is "+strconv.FormatInt(reqData.Age, 10)+".")})// 3: 路由监听端口r.Run(":8080") } - 结果

三: 响应参数
- Gin支持多种响应格式, 例如:json、结构体、XML、YAML类似于java的properties、ProtoBuf。
- 最常用的就是json。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 定义一个User结构体type User struct {Name string `json:"name"`Age int64 `json:"age"`}// 2: 编写路由处理函数r.POST("/user", func(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中context.BindJSON(&reqData)respData := gin.H{"name": "renshanwen","age": 25,}// 构造响应context.JSON(http.StatusOK, respData)})// 3: 路由监听端口r.Run(":8080") } - 结果:

四:数据解析和绑定
4.1: JSON数据解析绑定
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 1:实例化默认路由r := gin.Default()// 定义一个User结构体type User struct {// 名称 类型 被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)Name string `json:"name" binding:"required"`Age int64 `json:"age"`}// 2: 编写路由处理函数r.POST("/user", func(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中if err := context.BindJSON(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}// 构造响应context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 3: 路由监听端口r.Run(":8080")
}
- 缺失name测试

- 缺失age测试

4.2: FROM表单数据解析和绑定
- 表单只需要调整一下使用的方法:Bind和定义的类型form
package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 1:实例化默认路由r := gin.Default()// 定义一个User结构体type User struct {// 名称 类型 被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)Name string `form:"name" binding:"required"`Age int64 `form:"age"`}// 2: 编写路由处理函数r.POST("/user", func(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}// 构造响应context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 3: 路由监听端口r.Run(":8080") } - 测试


五: 路由组
- 作用:根据URL前缀可以分组。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http" )// 定义一个User结构体 type User struct {// 名称 类型 被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)Name string `form:"name" binding:"required"`Age int64 `form:"age"` }func main() {// 实例化默认路由r := gin.Default()// 定义一个路由组userRoutes := r.Group("/user"){userRoutes.POST("/shan", test)userRoutes.POST("/wen", test)}// 路由监听端口r.Run(":8080") }func test(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}// 构造响应context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})} } - 测试

六:异步处理
- 需求:某些处理, 我们可以放在后台去做, 接口要求立刻返回数据。 则可以使用异步处理的方式。
- 案例
package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time" )// 定义一个User结构体 type User struct {// 名称 类型 被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)Name string `form:"name" binding:"required"`Age int64 `form:"age"` }func main() {// 实例化默认路由r := gin.Default()// 定义一个路由组userRoutes := r.Group("/user"){userRoutes.POST("/action", test)}// 路由监听端口r.Run(":8080") }func test(context *gin.Context) {// 实例化UserreqData := User{}// 将内容绑定到字典中if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}// 进行异步处理go func() {for i := 0; i < 10; i++ {fmt.Printf("正在处理 %d \n", i)time.Sleep(3 * time.Second)}}()// 构造响应context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})} } - 结果, 先返回了响应, 后进行循环处理。

七:中间件
7.1: 全局中间件
- 所有的请求都经过的中间件。
- 例如: 所有的请求都经过
7.2: 局部中间件
相关文章:
Gin框架---基础综述
目录 一:经典入门案例二:请求参数2.1: API参数2.2: URL参数2.3: 表单参数 三: 响应参数四:数据解析和绑定4.1: JSON数据解析绑定4.2: FROM表单数据解析和绑定 五: 路由组六:异步处理七:中间件7.…...
排序算法-快速排序
属性 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有 …...
【Spring容器的启动过程】
Spring容器的启动过程 Spring 在初始化过程中有二个非常重要的步骤,容器的初始化与刷新。 初始化流程 如果想生成 bean 对象,那么就需要一个 beanFactory 工厂(DefaultListableBeanFactory)如果想让加了特定注解(如 …...
普通二本+转专业学计算机是什么感受
目录 自我介绍转入前为什么转专业为什么转入机械专业 转入后转入后感受确定自学计算机自学计算机的时间分配 自我介绍 作者现在是大二,由于当时高考考砸了,分数在重本线左右,为了去一个稍微好一点的学校,于是填报了化学工程与工艺(并不是说这专业不好,只是填报化工更容易进这个…...
力扣1、两数之和
转到力扣 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可…...
一百七十三、Flume——Flume写入HDFS后的诸多小文件问题
一、目的 在用Flume采集Kafka中的数据写入HDFS后,发现写入HDFS的不是每天一个文件,而是一个文件夹,里面有很多小文件,浪费namenode的宝贵资源 二、Flume的配置文件优化(参考了其他博文) (一&a…...
Android.mk中C++使用
参考: https://gerrit.twrp.me/c/android_bootable_recovery//4366/1/Android.mk ifeq ($(BOARD_USES_RECOVERY_AS_BOOT), true) LOCAL_CFLAGS -DBOARD_USES_RECOVERY_AS_BOOT endif ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE), true) LOCAL_CFLAGS -DBOA…...
K8S:Pod概念、分类及相关的策略
文章目录 一.pod相关概念1.Pod基础概念2.Kubrenetes集群中Pod两种使用方式3.pause容器的Pod中的所有容器共享的资源4.kubernetes中的pause容器主要为每个容器提供功能:5.Kubernetes设计这样的Pod概念和特殊…...
【Java杂谈】#1 【MCA JAVA后端架构师】
文章目录 巧用弱引用 解决 TreadLocal内存泄漏问题P5,P6,P7Spring 巧用弱引用 解决 TreadLocal内存泄漏问题 < Treadlocal > 本地调用框架使用(Spring) IOC,AOP注解transactional,自动支持事务处理…...
Vue3路由
文章目录 Vue3路由1. 载入vue-router 库2. 实例2.1 Vue.js vue-router 实现单页应用2.2 router-link创建链接2.3 router-view显示与url对应组件2.4 <router-link> 相关属性 Vue3路由 1. 载入vue-router 库 Vue.js 路由需要载入vue-router 库 安装直接下载地址…...
Android Studio的笔记--aidl实现和调用
android AIDL接口使用 aidl实现新建aidl实现工程build.gradleproguard-rules.pro增加aidl文件 增加aidl实现aidl实现服务打开aidl服务 aidl使用新建aidl使用工程增加aidl文件使用aidl方法 相关回显 aidl实现 新建aidl实现工程 新建一个工程。工程名testaidl。包名com.lxh.tes…...
大模型从入门到应用——LangChain:代理(Agents)-[工具包(Toolkit)]
分类目录:《大模型从入门到应用》总目录 工具包是工具的集合,这些工具被设计成一起用于特定的任务,并且具有方便的加载方法。常见的工具包如下: CSV代理JiraJSON代理OpenAPI代理自然语言APIPandas数据框架代理PlayWright浏览器工…...
VR全景算不算好的创业项目?有哪些特性?
现在是全民创业的时代,大家都在找创业项目,那么什么是好的创业项目呢?有人会问VR全景算不算创业好项目呢?一般情况下好的创业项目,发展前景和市场消费群体都是比较大的,市场需求大才能满足多数消费者的需求…...
Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
一、集成Log4j2⽇志框架 从Spring5之后,Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架: 第⼀步:引⼊Log4j2的依赖 <!--log4j2的依赖--> <dependency><groupId>org.apache.logging.log4j</groupId><a…...
flink的网络缓冲区
背景 在flink的taskmanager进行数据交互的过程中,网络缓冲区是一个可以提升网络交换速度的设计,此外,flink还通过网络缓冲区实现其基于信用值credit的流量控制,以便尽可能的处理数据倾斜问题 网络缓冲区 在flink中每个taskmana…...
产品经理学习笔记
产品文档之BRD、MRD和PRD - 知乎BRD、MRD和PRD一起被认为是从市场到产品需要形成的标准规范文档: 1、BRD(Business Requirement Document),商业需求文档,是一份产品商业论证报告,基于商业目标或价值所描述的…...
【深入理解Linux锁机制】七、互斥体
系列文章: 我的圈子:高级工程师聚集地 【深入理解Linux锁机制】一、内核锁的由来 【深入理解Linux锁机制】二、中断屏蔽 【深入理解Linux锁机制】三、原子操作 【深入理解Linux锁机制】四、自旋锁 【深入理解Linux锁机制】五、衍生自旋锁 【深入理解Linux锁机制】六、信…...
UGUI画布加载优化
在Unity中,UGUI画布的加载优化可以通过以下几种方式来实现: 1. 合理使用画布渲染模式:UGUI画布有三种渲染模式,分别是Screen Space - Overlay、Screen Space - Camera和World Space。在使用时,应根据场景需求选择最适…...
SEC的下一步目标是什么?过时的证券法与加密货币行业,哪个会被先淘汰?
加密货币已经“不合规”了,尤其是其“商业模式”,至少美国证券交易委员会(SEC)主席Gary Gensler这样认为。由于这种观点在美国监管机构中普遍存在,因此涉及加密的执法行动达到历史最高水平也不足为奇。 在短短几年内,我们目睹了所…...
Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)
目录 一、独立消费者消费某一个主题数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题数据案例 1.1、案例需求 创建一个独立消费者,消费firstTopic主题中数据,所下图所示: 注意:在消费者 API 代码中必…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
