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

gin路由相关方法

c.Request.URL.Path 拿到请求的路径

package main

import (
 "fmt"
 "github.com/gin-gonic/gin"
 "net/http"
)

//路由重定向,请求转发,ANY ,NoRoute,路由组
func main() {
 r := gin.Default()

 // ---------------路由重定向(到其他网址)---------------------
 r.GET("/index"func(c *gin.Context) {
  //c.IndentedJSON(200,gin.H{
  // "status":"ok",
  //})
  //  重定向到另一个地址
  c.Redirect(http.StatusMovedPermanently, "https://dashen.tech")
 })

 
 
 // ---------------转发(到其他接口)---------------------
 r.GET("/a"func(c *gin.Context) {
  // 跳转到 /b对应的路由; 地址栏的URL不会变,是请求转发  (而上面是**重定向**到https://dashen.tech,地址栏的地址改变了)
  c.Request.URL.Path = "/b" //把请求的URL修改
  r.HandleContext(c)        //继续后续的处理
 })

 r.GET("/b"func(context *gin.Context) {
  context.IndentedJSON(200, gin.H{
   "status""这是b路径,请求成功!",
  })
 })

 
 
 
 // ---------------Any: 任意http method(适用于restful,因为有同名的不同http method的方法)---------------------
 // 路径为/test的,不管是GET还是POST或者PUT等,均路由到这里
 r.Any("/test"func(c *gin.Context) {
  switch c.Request.Method {
  case http.MethodGet:
   c.IndentedJSON(200, gin.H{
    "info""api为/test,GET方式~",
   })

  case "POST":
   c.IndentedJSON(200, gin.H{
    "info""api为/test,POST方式~",
   })

  }
 })

 
 
 
 // --------------------NoRoute: 当匹配不到路径时到这里(其实gin默认有个404,取代之)--------------------
 r.NoRoute(func(c *gin.Context) {
  c.IndentedJSON(http.StatusNotFound, gin.H{
   "msg""任何没有匹配到的路径都会走到这里...(可以重定向到 寻找走丢儿童的网站)",
  })
 })

 
 
 
 // // ----------------Group: 路由组--------------------
 //把公用的前缀提取出来,创建一个路由组
 userGroup := r.Group("/user")
 { //通常加一个大括号 让代码看起来更有调理

  userGroup.GET("/getName"func(context *gin.Context) {
   //等价于 /user/getname
   context.IndentedJSON(http.StatusOK, gin.H{
    "name""张三",
   })
  })
  userGroup.GET("/getGender"func(context *gin.Context) {
   context.IndentedJSON(200, gin.H{
    "gender""男",
   })
  })

  userGroup.POST("/updateAvatar"func(context *gin.Context) {
   context.IndentedJSON(http.StatusOK, gin.H{
    "msg""头像更新成功",
   })
  })

  // 可以嵌套路由组
  // 即 /user/address
  addressGroup := userGroup.Group("/address")

  // 即/user/address/city
  addressGroup.GET("/city"func(c *gin.Context) {
   c.IndentedJSON(200, gin.H{
    "city""阿姆斯特丹",
   })
  })
 }

 
 
 fmt.Println("路由规则初始化完毕")
 r.Run()

 //go func() {
 // r.Run()
 //}()

 //select {}

}

路由重定向


alt

转发


alt

Any: 捕获同名接口的任意http method


多方式匹配,包括:

GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE

alt
alt

NoRoute: 当匹配不到路径时到这里


alt

路由组


alt

默认区分大小写

alt

通配符匹配


对于接口 /v1/say/xxxx接口(POST方法,参数为body里传一个name类型的json),当say后面为任意字符时,均路由到helloHandler方法进行处理

package main

import (
 "fmt"
 "net/http"

 "github.com/gin-gonic/gin"
)

// Param 请求参数
type Param struct {
 Name string `json:"name"`
}

// helloHandler /hello请求处理函数
func helloHandler(c *gin.Context) {
 var p Param
 if err := c.ShouldBindJSON(&p); err != nil {
  c.JSON(http.StatusOK, gin.H{
   "msg""name参数缺失",
  })
  return
 }
 c.JSON(http.StatusOK, gin.H{
  "msg": fmt.Sprintf("hello %s", p.Name),
 })
}

// SetupRouter 路由
func SetupRouter() *gin.Engine {
 router := gin.Default()
 //router.POST("/v1/say/hello", helloHandler)
 //router.POST("/v1/say/hello1", helloHandler)
 //router.POST("/v1/say/hello3", helloHandler)
 //router.POST("/v1/say/asdfg", helloHandler)

 // 需要/v1/task/后面任意路径,均路由到 helloHandler
 router.POST("/v1/say/*any678", helloHandler)
 return router
}

func main() {
 g := SetupRouter()
 g.Run() // listen and serve on 0.0.0.0:8080
}


alt

*需要加任意字符,但不能不加(只写*的话会报错)

alt

参考:

Gin框架 路由重定向,请求转发,ANY ,NoRoute,路由组

我给 gin 提交了一行代码

Gin group级别的NoRoute

未知调用方式,静态资源返回,静态资源目录等,可参考 Golang Gin 框架 Route备注




两种写法的比较


 r.Run()

    和

 go func() {
  r.Run()
 }()

 select {}

第一种方式是同步的,上面的所有路由都加载完,才会运行服务

第二种方式是异步的,假设有这样一种情况,前面的路由解析都很快,但在解析最后几个路由时,特别慢(当然现实情况不太可能)。 那可以把r.Run()以异步的形式写在最上面,即启动服务和加载路由同步进行。 那前面已解析的路由就可以访问了

如:

package main

import (
 "fmt"
 "github.com/gin-gonic/gin"
 "net/http"
 "time"
)

//路由重定向,请求转发,ANY ,NoRoute,路由组
func main() {
 r := gin.Default()

 go func() {
  r.Run()
 }()

 // ---------------路由重定向(到其他网址)---------------------
 r.GET("/index"func(c *gin.Context) {
  //c.IndentedJSON(200,gin.H{
  // "status":"ok",
  //})
  //  重定向到另一个地址
  c.Redirect(http.StatusMovedPermanently, "https://dashen.tech")
 })

 // ---------------转发(到其他接口)---------------------
 r.GET("/a"func(c *gin.Context) {
  // 跳转到 /b对应的路由; 地址栏的URL不会变,是请求转发  (而上面是**重定向**到https://dashen.tech,地址栏的地址改变了)
  c.Request.URL.Path = "/b" //把请求的URL修改
  r.HandleContext(c)        //继续后续的处理
 })

 r.GET("/b"func(context *gin.Context) {
  context.IndentedJSON(200, gin.H{
   "status""这是b路径,请求成功!",
  })
 })

 // ---------------Any: 任意http method(适用于restful,因为有同名的不同http method的方法)---------------------
 // 路径为/test的,不管是GET还是POST或者PUT等,均路由到这里
 r.Any("/test"func(c *gin.Context) {
  switch c.Request.Method {
  case http.MethodGet:
   c.IndentedJSON(200, gin.H{
    "info""api为/test,GET方式~",
   })

  case "POST":
   c.IndentedJSON(200, gin.H{
    "info""api为/test,POST方式~",
   })

  }
 })

 time.Sleep(86400 * time.Second) // 假设下面的路由1天后才会解析

 // --------------------NoRoute: 当匹配不到路径时到这里(其实gin默认有个404,取代之)--------------------
 r.NoRoute(func(c *gin.Context) {
  c.IndentedJSON(http.StatusNotFound, gin.H{
   "msg""任何没有匹配到的路径都会走到这里...(可以重定向到 寻找走丢儿童的网站)",
  })
 })

 // ----------------Group: 路由组--------------------
 //把公用的前缀提取出来,创建一个路由组
 userGroup := r.Group("/user")
 { //通常加一个大括号 让代码看起来更有调理

  userGroup.GET("/getName"func(context *gin.Context) {
   //等价于 /user/getname
   context.IndentedJSON(http.StatusOK, gin.H{
    "name""张三",
   })
  })
  userGroup.GET("/getGender"func(context *gin.Context) {
   context.IndentedJSON(200, gin.H{
    "gender""男",
   })
  })

  userGroup.POST("/updateAvatar"func(context *gin.Context) {
   context.IndentedJSON(http.StatusOK, gin.H{
    "msg""头像更新成功",
   })
  })

  // 可以嵌套路由组
  // 即 /user/address
  addressGroup := userGroup.Group("/address")

  // 即/user/address/city
  addressGroup.GET("/city"func(c *gin.Context) {
   c.IndentedJSON(200, gin.H{
    "city""阿姆斯特丹",
   })
  })
 }

 fmt.Println("路由规则初始化完毕")

 select {}

}
alt

可见,已解析的路由可正常访问,未解析的访问则会404

alt

本文由 mdnice 多平台发布

相关文章:

gin路由相关方法

c.Request.URL.Path 拿到请求的路径 package mainimport ( "fmt" "github.com/gin-gonic/gin" "net/http")//路由重定向,请求转发,ANY ,NoRoute,路由组func main() { r : gin.Default() // -------…...

vue项目 Editor.md使用示例

简介 Editor.md 支持“标准” Markdown / CommonMark 和 Github 风格的语法,也可变身为代码编辑器; 支持实时预览、图片(跨域)上传、预格式文本/代码/表格插入、代码折叠、搜索替换、只读模式、自定义样式主题和多语言语法高亮等…...

12.3 实现模拟鼠标录制回放

本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在Windows系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的…...

【计算机网络-自顶向下方法】应用层(SMTP、POP3、DNS)

目录 1. Electronic Mail电子邮件应用画像1.1 电子邮件系统1.2 邮件报文格式1.3 邮件访问 2. DNS(Domain Name System)2.1 DNS提供的服务2.2 DNS工作机理2.3 DNS资源记录2.4 DNS协议,报文2.5 小结 1. Electronic Mail 电子邮件应用画像 应用…...

【Pm4py第八讲】关于Statistics

本节用于介绍pm4py中的统计函数,包括统计轨迹变体、案例持续时间、案例到达时间等。 1.函数概述 本次主要介绍Pm4py中一些常见的统计函数,总览如下表: 函数名说明pm4py.stats.get_start_activities()从事件日志中获取开始活动。pm4py.stats.…...

【Azure 架构师学习笔记】-Azure Data Factory (5) --Data Flow

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 Azure Data Factory, ADF 是微软Azure 的ETL 首选服务之一, 是Azure data platfor…...

uniapp之ios开发及支付整体流程爬坑记录

前言 在写这篇记录的时候,关于ios的支付已经对接的差不多了,下一步就是测试好了直接发版,总共花了好几周的时间,从0到1对于首次做ios支付来说,确实很多坑。 其实业务层面很简单,甚至比安卓支付还简单&…...

AutoDL百川大模型体验

文章目录 镜像克隆模型下载测试效果AutoDL自定义服务 感谢AutoDL和CodeWithGPU这两个平台,让我们能低成本,低门槛地部署体验这些大模型 镜像克隆 我是在CodeWithGPU上克隆的这个镜像 模型下载 codewithgpu有介绍 注意这三个文件都需要下载 把那个&quo…...

蓝桥杯每日一题2023.10.8

题目描述 七段码 - 蓝桥云课 (lanqiao.cn) 题目分析 所有的情况我们可以分析出来一共有2的7次方-1种,因为每一个二极管都有选择和不选择两种情况,有7个二极管,但是还有一种都不选的情况需要排除,故-1 枚举每个方案看是否符合要…...

jmeter,性能测试,Locust

一。性能测试的概念 1.性能:就是软件质量属性中的 “ 效率 ” 特性 2.效率特性: 时间特性:指系统处理用户请求的响应时间 资源特性:指系统在运行过程中,系统资源的消耗情况 CPU 内存 磁盘IO(磁盘的写…...

opencv图像的直方图,二维直方图,直方图均衡化

文章目录 opencv图像的直方图,二维直方图,直方图均衡化一、图像的直方图1、什么是图像的直方图:2、直方图的作用:3、如何绘制图像的直方图:(1)cv::calcHist()函数原型:英文单词 calc…...

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…...

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…...

ToBeWritten之车联网安全中常见的TOP 10漏洞

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...

软考-密码学概述

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 密码学基本概念 密码学的主要目的是保持明文的秘密以防止攻击者获知,而密码分…...

windows 2003、2008远程直接关闭远程后设置自动注销会话

1、2003系统: 按开始—运行—输入“tscc.msc”,打开“终端服务配置”。 单击左边窗口的“连接”项,右边窗口中右击“RDP-TCP”,选择“属性”。 单击“会话”项,勾选“替代用户设置”,在“结束已断开的会话”…...

iOS BUG UIView转UIImage模糊失真

iOS BUG UIView转UIImage模糊失真 ##UIView转成Image - (UIImage *)capture {UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *img UIGraphicsGetImageFromCurrentImageContext(…...

如何在10分钟内让Android应用大小减少 60%?

一个APP的包之所以大,主要包括一下文件 代码libso本地库资源文件(图片,音频,字体等) 瘦身就主要瘦这些。 一、打包的時候刪除不用的代码 buildTypes {debug {...shrinkResources true // 是否去除无效的资源文件(如…...

网络代理技术:保障隐私与增强安全

在当今数字化的世界中,网络代理技术的重要性日益凸显。无论您是普通用户还是网络工程师,了解如何使用代理技术来保护隐私和增强网络安全都是至关重要的。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和隐私保护中的关键作用。 1. Socks5代理&am…...

数据结构 | (二) List

什么是 List 在集合框架中, List 是一个接口,继承自 Collection 。 Collection 也是一个接口 ,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable 也是一个接口,表示实现该接口的类是可以逐个…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...