当前位置: 首页 > news >正文

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框架---基础综述

目录 一&#xff1a;经典入门案例二&#xff1a;请求参数2.1: API参数2.2: URL参数2.3: 表单参数 三&#xff1a; 响应参数四&#xff1a;数据解析和绑定4.1: JSON数据解析绑定4.2: FROM表单数据解析和绑定 五&#xff1a; 路由组六&#xff1a;异步处理七&#xff1a;中间件7.…...

排序算法-快速排序

属性 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元 素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所有 …...

【Spring容器的启动过程】

Spring容器的启动过程 Spring 在初始化过程中有二个非常重要的步骤&#xff0c;容器的初始化与刷新。 初始化流程 如果想生成 bean 对象&#xff0c;那么就需要一个 beanFactory 工厂&#xff08;DefaultListableBeanFactory&#xff09;如果想让加了特定注解&#xff08;如 …...

普通二本+转专业学计算机是什么感受

目录 自我介绍转入前为什么转专业为什么转入机械专业 转入后转入后感受确定自学计算机自学计算机的时间分配 自我介绍 作者现在是大二,由于当时高考考砸了,分数在重本线左右,为了去一个稍微好一点的学校,于是填报了化学工程与工艺(并不是说这专业不好,只是填报化工更容易进这个…...

力扣1、两数之和

转到力扣 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可…...

一百七十三、Flume——Flume写入HDFS后的诸多小文件问题

一、目的 在用Flume采集Kafka中的数据写入HDFS后&#xff0c;发现写入HDFS的不是每天一个文件&#xff0c;而是一个文件夹&#xff0c;里面有很多小文件&#xff0c;浪费namenode的宝贵资源 二、Flume的配置文件优化&#xff08;参考了其他博文&#xff09; &#xff08;一&a…...

Android.mk中C++使用

参考&#xff1a; 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相关概念&#xff11;.Pod基础概念&#xff12;.Kubrenetes集群中Pod两种使用方式&#xff13;.pause容器的Pod中的所有容器共享的资源&#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a;&#xff15;.Kubernetes设计这样的Pod概念和特殊…...

【Java杂谈】#1 【MCA JAVA后端架构师】

文章目录 巧用弱引用 解决 TreadLocal内存泄漏问题P5&#xff0c;P6&#xff0c;P7Spring 巧用弱引用 解决 TreadLocal内存泄漏问题 < Treadlocal > 本地调用框架使用&#xff08;Spring&#xff09; IOC&#xff0c;AOP注解transactional&#xff0c;自动支持事务处理…...

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 库 安装直接下载地址&#xf…...

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)]

分类目录&#xff1a;《大模型从入门到应用》总目录 工具包是工具的集合&#xff0c;这些工具被设计成一起用于特定的任务&#xff0c;并且具有方便的加载方法。常见的工具包如下&#xff1a; CSV代理JiraJSON代理OpenAPI代理自然语言APIPandas数据框架代理PlayWright浏览器工…...

VR全景算不算好的创业项目?有哪些特性?

现在是全民创业的时代&#xff0c;大家都在找创业项目&#xff0c;那么什么是好的创业项目呢&#xff1f;有人会问VR全景算不算创业好项目呢&#xff1f;一般情况下好的创业项目&#xff0c;发展前景和市场消费群体都是比较大的&#xff0c;市场需求大才能满足多数消费者的需求…...

Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit

一、集成Log4j2⽇志框架 从Spring5之后&#xff0c;Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架&#xff1a; 第⼀步&#xff1a;引⼊Log4j2的依赖 <!--log4j2的依赖--> <dependency><groupId>org.apache.logging.log4j</groupId><a…...

flink的网络缓冲区

背景 在flink的taskmanager进行数据交互的过程中&#xff0c;网络缓冲区是一个可以提升网络交换速度的设计&#xff0c;此外&#xff0c;flink还通过网络缓冲区实现其基于信用值credit的流量控制&#xff0c;以便尽可能的处理数据倾斜问题 网络缓冲区 在flink中每个taskmana…...

产品经理学习笔记

产品文档之BRD、MRD和PRD - 知乎BRD、MRD和PRD一起被认为是从市场到产品需要形成的标准规范文档&#xff1a; 1、BRD&#xff08;Business Requirement Document&#xff09;&#xff0c;商业需求文档&#xff0c;是一份产品商业论证报告&#xff0c;基于商业目标或价值所描述的…...

【深入理解Linux锁机制】七、互斥体

系列文章: 我的圈子:高级工程师聚集地 【深入理解Linux锁机制】一、内核锁的由来 【深入理解Linux锁机制】二、中断屏蔽 【深入理解Linux锁机制】三、原子操作 【深入理解Linux锁机制】四、自旋锁 【深入理解Linux锁机制】五、衍生自旋锁 【深入理解Linux锁机制】六、信…...

UGUI画布加载优化

在Unity中&#xff0c;UGUI画布的加载优化可以通过以下几种方式来实现&#xff1a; 1. 合理使用画布渲染模式&#xff1a;UGUI画布有三种渲染模式&#xff0c;分别是Screen Space - Overlay、Screen Space - Camera和World Space。在使用时&#xff0c;应根据场景需求选择最适…...

SEC的下一步目标是什么?过时的证券法与加密货币行业,哪个会被先淘汰?

加密货币已经“不合规”了&#xff0c;尤其是其“商业模式”&#xff0c;至少美国证券交易委员会(SEC)主席Gary Gensler这样认为。由于这种观点在美国监管机构中普遍存在&#xff0c;因此涉及加密的执法行动达到历史最高水平也不足为奇。 在短短几年内&#xff0c;我们目睹了所…...

Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)

目录 一、独立消费者消费某一个主题数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题数据案例 1.1、案例需求 创建一个独立消费者&#xff0c;消费firstTopic主题中数据&#xff0c;所下图所示&#xff1a; 注意&#xff1a;在消费者 API 代码中必…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块&#xff0c;提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中&#xff0c;这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构&#xff0c;与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...