Gin 详解

Gin

介绍

gin框架是一个基于go语言的轻量级web框架,它具有高效性、灵活性、易扩展性

路由

gin框架使用的是定制版的httprouter
其路由原理是大量使用公共前缀的树结构,注册路由的过程就是构造前缀树的过程。
具有公共前缀的节点也共享一个公共父节点。

在这里插入图片描述

  • 路由注册
// 在 Gin 中,路由通过 GET、POST、PUT、DELETE 等 HTTP 方法与 URL 路径的组合来定义。
// 这些方法直接作为 Gin 实例(通常命名为 r)的方法调用,接收一个字符串表示路径,一个或两个函数参数作为处理函数。
r := gin.Default()
// 注册 GET 路由
r.GET("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello, world!"})
})
// 注册 POST 路由
r.POST("/login", loginHandler)
r.Run(":8080") // 启动服务器监听 8080 端口
  • 路由参数
// Gin 支持在路由路径中定义参数,这些参数可以通过 c.Param() 在处理函数中获取
// 动态路径参数:
r.GET("/users/:username", getUsers)
// 正则约束参数:
r.GET("/articles/:id([0-9]+)", getArticleByID)
  • 路由分组
// 通过创建 gin.RouterGroup 对象,可以为一组相关的路由设置共享的中间件、前缀等属性。
admin := r.Group("/admin")
admin.Use(AuthMiddleware) // 添加针对该分组的中间件
// 在分组内注册路由
admin.GET("/users", listAdminUsers)
admin.POST("/users", createAdminUser)
  • 路由重定向与别名
// Gin 允许设置路由重定向规则,将一个路径重定向到另一个路径:
r.GET("/old-path", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "/new-path")
})
  • 路由处理函数
处理函数接收一个 *gin.Context 参数,该对象包含了请求和响应的所有相关信息,通常完成以下任务:
- 读取请求数据:通过 c.Query()、c.PostForm()、c.ShouldBind() 等方法获取查询参数、表单数据或 JSON/XML 等请求体内容
- 响应数据:使用 c.JSON()、c.XML()、c.String()、c.File() 等方法向客户端发送响应
- 中间件:调用 c.Next() 传递控制权给下一个中间件或者结束请求
  • 嵌套路由与命名组
// Gin 支持嵌套的路由分组,可以创建层次化的路由结构:
v1 := r.Group("/api/v1", authMiddleware)
{users := v1.Group("/users"){users.GET("/:id", getUser)users.POST("/", createUser)}articles := v1.Group("/articles"){articles.GET("/:id", getArticle)articles.POST("/", createArticle)}
}
// 可以为分组命名,便于在中间件或其他地方引用:
auth := r.Group("/auth", AuthMiddleware)
{auth.GET("/login", loginHandler).Name("login")auth.POST("/logout", logoutHandler).Name("logout")
}
loginURL := r.MustGet("login").URL()  // 使用命名路由

中间件

中间件常用来实现一些通用的功能,如日志记录、权限校验、数据加工等分为全局中间件和局部中间件两种类型:全局中间件作用于所有路由之前,局部中间件则是作用于某个路由或路由组之前。
  • 流程控制函数
1. c.Next(): 调用该函数会将控制权交给下一个中间件函数,如果没有下一个中间件函数,则将控制权交给处理请求的路由处理函数2. c.Abort(): 调用该函数会立即终止当前中间件函数的执行,并且不会再调用后续的中间件函数或路由处理函数3. c.AbortWithStatus(code int): 调用该函数会终止当前中间件函数的执行,并返回指定的HTTP状态码给客户端4. c.NextWithError(): 调用该函数会将控制权交给下一个中间件函数,同时传递一个错误给下一个中间件函数或路由处理函数5. c.IsAborted(): 该函数用于判断当前请求是否已经被终止,返回一个布尔值表示请求是否已经被终止

context

用于处理 HTTP 请求和响应,是通过中间件来传递的
在 Gin 的处理流程中,Context 贯穿整个处理过程,用于传递请求和响应的信息
  • 参数绑定、表单验证
Bind()系列函数:根据request的数据类型,将其解析到结构体或map
  • 参数传递
有成员Keys,上游需要传递的变量可以放在里面,下游处理时再从里面取出来,实现上下游参数传递,对应Set()Get()方法
  • 渲染不同格式的响应
// JSON响应、文本字符串响应、HTML 响应
c.JSON()
c.String()
c.HTML()

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

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

相关文章

怎么移除pdf文件编辑限制,有哪些方法?

PDF是我们在学习或工作中常常应用到的一种文件格式,因为它的跨平台性和文档保真度而备受欢迎。但是,有时我们会遇到PDF编辑权限被限制了,那么pdf解除编辑限制可以用什么方法呢?别急,接下来,本文将深入探讨如…

关于Panabit在资产平台中类型划分问题

现场同事问了一个问题:Panabit能不能当做CentOS接入? 我第一反应是:Panabit是个什么鬼?为啥要混编接入?后期维护都是事啊。所以,我就想回答:不能! 但是,最好要给出一个…

通过sql语句直接导出excel文件

SELECT column1 as 名字 FROM your_table INTO OUTFILE /path/to/your_file.csv FIELDS TERMINATED BY , ENCLOSED BY " LINES TERMINATED BY \n 这里的注意事项是,INTO OUTFILE 这后面的路径需要通过下面的SQL查出来 show variables like %secure%; 操作步骤…

构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛

在当前云计算和微服务架构日益普及的背景下,企业和开发者对云资源的依赖日益加深。Elastic Compute Service(ECS)作为提供计算能力的核心服务,承担着众多的业务。随着微服务架构的广泛应用,任务的部署和执行变得更为灵…

mysql密码过期的修改(Your password has expired. ..)

参考文章:mysql密码过期的修改方法(your password has expired)_我是知青-RuoYi 若依 (csdn.net) 问题:Your password has expired. To log inyou must change it using a clientthat supports expired passwords. 解决方式&…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风,无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚,让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者,还是需要高效沟通的商务人士,无线领夹麦克风都能满足你的需求,让你的声…

Kantana和The Sandbox联手打造元宇宙娱乐的未来

The Sandbox 是一个开创性的元宇宙、游戏和创作平台,泰国领先的娱乐公司 Kantana 很高兴地宣布双方将建立合作关系,共同打造元宇宙娱乐的未来。 此次合作结合了 Kantana 引以为傲的故事讲述专长和The Sandbox 的用户生成内容 (UGC) 工具,创建…

Shardingsphere-Proxy 5.5.0部署

Shardingsphere-Proxy 5.5.0部署 Shardingsphere系列目录:背景下载安装包Linux解压安装包修改配置文件global.yamldatabase-sharding.yaml 引入数据库驱动启动代理连接代理数据库Navicate工具连接MYSQL客户端连接 Shardingsphere系列目录: 【Springboot…

山东大学软件学院创新项目实训开发日志——收尾篇

山东大学软件学院创新项目实训开发日志——收尾篇 项目名称:ModuFusion Visionary:实现跨模态文本与视觉的相关推荐 -------项目目标: 本项目旨在开发一款跨模态交互式应用,用户可以上传图片或视频,并使用文本、点、…

ardupilot开发 --- RTSP视频流 篇

我年轻时很穷,努力了几年,终于不再年轻了 0. 一些概念参考文献 0. 一些概念 RTSP服务、RTSP推流、RTSP拉流,缺一不可,尤其是RTSP服务。RTSP服务器、RTSP客户端。推流和拉流都是由客户端发起,向服务器发起对应的请求。…

【千帆AppBuilder】你有一封邮件待查收|未来的我,你好吗?欢迎体验AI应用《未来信使》

我在百度智能云千帆AppBuilder开发了一款AI原生应用,快来使用吧!「未来信使」:https://appbuilder.baidu.com/s/Q1VPg 目录 背景人工智能未来的信 未来信使功能介绍Prompt组件 千帆社区主要功能AppBuilderModelBuilder详细信息 推荐文章 未来…

LUA移植到STM32F4,移植REPL,通过RTT Viewer交互

概述 站内移植LUA多数是使用C函数调用LUA,并没有移植REPL交互端口 本文将REPL也移植进去,做了简单的适配 LUA源码使用标准C库函数,如fgets,fwrite等,在嵌入式环境中要使用fgets,fwrite等C库函数&#xff…

头歌资源库(13)背包问题

一、 问题描述 二、算法思想 这是一个背包问题,可以使用动态规划算法来解决。具体思路如下: 定义一个二维数组dp,dp[i][j]表示前i个物品在背包容量为j时能获取的最大价值。初始化dp数组的第一行和第一列为0,表示当只有一个物品或…

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好,我是锋哥。今天分享关于 【SQL 语言包括哪几部分?每部分都有哪些操作关键字?】面试题,希望对大家有帮助; SQL 语言包括哪几部分?每部分都有哪些操作关键字? SQL 语言包括数据定义(DDL)、…

大屏适配方案汇总

1. 适配方案1:rem font-size 我们都知道,在 css 中 1rem 等于 html 根元素设定的 font-size 的 px 值,通过动态的修改html 根元素的 font-size 大小就能动态的改变 rem 的大小,从而实现适配。 原理 动态设置 HTML 根字体大小将…

制作一个苹果软件自动运行工具需要用到的源代码!

在数字化时代的浪潮中,自动化运行工具扮演着越来越重要的角色,这些工具可以极大地提高工作效率,减少人为操作的繁琐和错误。 在苹果软件生态系统中,制作一个自动运行工具同样具有广泛的应用前景,本文将围绕“制作一个…

模拟原神圣遗物系统-小森设计项目,需求分析

需求分析 我操控某个角色的圣遗物时发现,一开始玩啥也不懂慢慢了解,今天才想起要不做一个 ,然后开始想需求 跟Ai聊技术 聊着聊着 发现圣遗物 这个东西有点意思 本来今天打算写一下数据库 的外键想起了一些高兴的事情(美人鱼&#…

C# WinForm —— 36 布局控件 GroupBox 和 Panel

1. 简介 两个可以盛放其他控件的容器,可以用于把不同的控件分组,一般不会注册事件 GroupBox:为其他控件提供可识别的分组。可通过Text属性设置标题;有边框;没有滚动条,一般用于按功能分组 Panel&#xff…

SpringBoot+Maven项目的配置构建

文章目录 1、application.properties2、pom.xml 1、application.properties 也可使用yml yaml #静态资源 spring.mvc.static-path-pattern/images/** #上传文件大小设置 spring.http.multipart.max-file-size10MB spring.http.multipart.max-request-size10MBspring.mvc.path…