Gin 详解

news2024/11/16 13:36:35

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.coloradmin.cn/o/1839541.html

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

相关文章

若依 ruoyi 显示隐藏搜索框 显示隐藏列

一、 显示隐藏搜索框 页面搜索关键字 showSearch,设置是否显示 隐藏: 显示: 二、自定义设置 显示隐藏列 1. 页面搜索关键字 right-toolbar,新增: :columns"columns" 2. js下 data(){return{}}中新增&am…

手把手教你创建并启动一个Vue3项目(Windows版)

一、Node安装 1、下载地址:Node.js — Run JavaScript Everywhere 2、安装Node,双击启动一直Next 3、验证安装Node是否成功,打开CMD命令窗口,输入node -v,显示版本就表示成功 4、验证安装npm是否成功,npm是…

DFS(一)

问题一(指数级选择) 从1~n这n个整数中任意选取多个,输出所有可能的选择方案。 首先想一下,在现实世界中,我们要如何解决这个问题。 应该是一个一个枚举,即每个数都可以有两个选择(选/不选)。共有种结果。 想一下,如…

UI设计速成课:理解模态窗口与非模态窗口的区别

我们日常所说的弹性框架是非常笼统的概念。我们习惯性地称之为对话框架、浮动层和提示条。弹性框架可以分为两种:模态弹性框架和非模态弹性框架。产品需要弹性框架来传递信息,用户需要弹性框架来接受反馈,但是没有经过推敲的弹出窗口设计很容易让用户感到…

mouseinc-smartUp Gestures被禁用后的替代品

前言 smartUp Gestures恶意软件,既然谷歌这么判断,可能大概率没错了,我们换一个mouseInc吧下载地址 https://www.123pan.com/s/fDzUVv-hCtlA 设置下会更好用 设置 通过AHK设置下一些快捷操作~ 对应的查找 https://source.chromium.org/chromium/chromium/src//main:chrome/a…

【CT】LeetCode手撕—20. 有效的括号

题目 原题连接&#xff1a;20. 有效的括号 1- 思路 模式识别 模式1&#xff1a;括号左右匹配 ——> 借助栈来实现 ——> Deque<Character> deque new LinkedList<>()模式2&#xff1a;顺序匹配 ——> 用 if 判断 具体思路 1.遇到左括号 直接入栈相应…

【Java面试】二十二、JVM篇(下):JVM参数调优与排查

文章目录 1、JVM的参数在哪里设置2、常见的JVM调优参数有哪些3、常见的JVM调优工具有哪些4、Java内存泄漏的排查思路5、CPU飙高的排查思路 1、JVM的参数在哪里设置 war包部署&#xff0c;在tomcat中设置&#xff0c;修改TOMCAT_HOME/bin/catalina.sh 文件 jar包启动&#xff0…

华为IPD体系中三大流程之IPD流程的六个阶段和七个评审点介绍

概念 IPD集成产品开发&#xff0c;英文是IntegratedProduct Development&#xff0c;是一整套科学的研发创新管理方法论&#xff0c;将产品经营管理思想和理念置入到新产品开发和产品管理过程中&#xff0c;因此IPD是不仅是一套研发管理体系&#xff0c;更是一套产品经营管理体…

Z世代职场价值观的重塑:从“班味”心态到个人成长的追求

近日&#xff0c;社交平台Soul APP联合上海市精神卫生中心&#xff08;俗称“宛平南路600号”&#xff09;发布《2024年Z世代职场心理健康报告》&#xff08;下称“报告”&#xff09;&#xff0c;发现今天的年轻人正以其独特的价值观和行为模式&#xff0c;重新定义成功与成就…

安装VSCode创建注册表出错,RegCreateKey错误码5

今天对VSCode进行做更新安装&#xff0c;谁知道安装到最后弹出下面这么个错误 找到windows下管用的一种解决办法&#xff1a; winR打开运行&#xff0c;输入 regedit找到错误提示中的路径&#xff0c;HKEY_CURRENT_USER\Software\Classes\VSCode.class\open (图中的错误注册表…

边学边赛拿冠军!北邮学子勇夺昇腾AI原生创新算子挑战赛金奖

导读 如何从零开始学习算子开发&#xff1f;昇腾AI原生创新算子挑战赛冠军“法宝”大揭秘。 “0xCCCCCCCC团队夺冠&#xff01;” 2024年5月9日&#xff0c;在首届昇腾AI原生创新算子挑战赛S1赛季决赛现场&#xff0c;来自北京邮电大学0xCCCCCCCC团队的孙明志和梁昊骞以总分第…

基于IDEA的Maven(坐标信息介绍和编写)

这篇博客来学习和分析一下&#xff1a; " pom.xml " 所生成的最基本的信息。 之前的博客中讲到&#xff0c;学 Maven 就是学 " pom.xml " 的配置。后面也会围绕这个文件进行学习。 目录 一、分析 pom.xml 文件 &#xff08;1&#xff09;分析的 "p…

如何设置文件夹密码?文件夹加密如何操作!分享4款安全加密软件!

在数字化时代&#xff0c;数据安全显得尤为重要。设置文件夹密码和加密操作是保护个人或企业数据不被非法访问的有效手段。本文将为您详细介绍如何设置文件夹密码和加密操作&#xff0c;并分享四款安全加密软件&#xff0c;助您轻松提升数据安全防护能力。 一、如何设置文件夹/…

css布局之flex应用

/*父 100*/.parent-div {/* 这里添加你想要的属性 */display: flex;flex-direction: row; //行justify-content: space-between; //左右对齐align-items: center;flex-wrap: wrap; //换行}/*中 90 10 */.middle-div {/* 这里添加你想要的属性 */display: flex;flex-direction:…

揭开AI大模型的神秘面纱:一文看懂GPT-4的核心技术

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;特别是AI大模型的崛起&#xff0c;给人们的生活和工作带来了深远的影响。作为其中的佼佼者&#xff0c;GPT-4备受瞩目。那么&#xff0c;GPT-4的核心技术究竟是什么&#xff1f;它是如何运作的&a…

YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone

1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…

ChatGPT 提示词技巧一本速通

目录 一、基本术语 二、提示词设计的基本原则 三、书写技巧 2.1 赋予角色 2.2 使用分隔符 2.2 结构化输出 2.3 指定步骤 2.4 提供示例 2.5 指定长度 2.6 使用或引用参考文本 2.7 提示模型进行自我判断 2.8 思考问题的解决过程 ​编辑 2.10 询问是否有遗漏 2.11 …

快速使用OpenVINO的 Anomalib实现训练和推理

快速使用OpenVINO的 Anomalib实现训练和推理 代码运行的结果截图 代码 import os from pathlib import Path from anomalib.data import MVTec from anomalib import TaskType from anomalib.deploy import ExportType, OpenVINOInferencer from anomalib.engine import Engine…

【第19章】Vue实战篇之主页面

文章目录 前言一、代码1. 主界面代码2. App.vue 二、展示总结 前言 登录完成之后&#xff0c;应该自动跳转到主页面&#xff0c;接下来我们搭建主界面。 一、代码 1. 主界面代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchBut…

IPV6配置一

1、接口配置 IPV6 的单播地址&#xff1b; 1)link-local (1)rl(config)#interface fastEthernet 0/0 rl(config-if)#ipv6 enable (2)手工或自动配置一个IPV6的AGUA&#xff0c;均会生成一个 link-local地址&#xff1b;但无论配置多少个AGUA地址&#xff0c;也只能生产一个link…