gin路由相关方法

news2024/11/18 1:36:12

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 多平台发布

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

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

相关文章

Python 无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式,需要导入Font类,设置Font初始化参数,常见参数如下: 关键字参数 数据类型 描述 name 字符串 字体名称,如Calibri或Times New Roman size 整型 大小点数 bold …

Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar

原文网址:Spring注册Bean系列--方法5:ImportImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法:ImportImportBeanDefinitionRegistrar。 注册Bean的方法我写了一个系列,见&#xff…

NAT模式和桥接模式的区别

NAT模式和桥接模式的区别 NAT模式和桥接模式都是虚拟机网络配置的两种方式,主要区别在于虚拟机与外部网络交互的方式不同。 NAT(Network Address Translation,网络地址转换)模式:在这种模式下,虚拟机和宿主…

SystemUI状态栏

SystemUI状态栏 1、日志开关2、相关属性配置3、Statusbar界面启动 android13-release 1、日志开关 Log.isLoggable通过设置属性,重启应用;Compile.IS_DEBUG日志开关是src-debug和src-release版本区别 frameworks\base\packages\SystemUI\src\com\android…

C++设计模式-外观(Facade)

目录 C设计模式-外观(Facade) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-外观(Facade) 一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接…

阿里云服务器Anolis OS龙蜥操作系统详细介绍

阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出,Anolis OS是CentOS 8 100%兼容替代版本,Anolis OS是完全开源、中立、开放的Linux发行版,具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…

机器视觉行业最可怕的不是以量换价吗?而是买方市场的带量采购,量价挂钩

机器视觉行业其实有很多值得思考,人力成本(团队人数控制),硬件成本,售后成本,回款成本(收款成本)。那么我们今天谈谈带量采购,量价挂钩、以量换价。这个话题有很多争议,很多有趣的争论,也有值得我们后人评价。 什么是“以价换量”? 从经济学角度来看,“以价换量…

linux入门---信号的操作

目录标题 sigset_tsigset_t的操作函数sigprocmasksigpending信号的屏蔽测试sigaction sigset_t 为了能够让操作系统更好的使用信号,操作系统提供了sigset_t的数据类型,操作系统中存在pending表和block表,但是这两张表是内核数据结构&#xf…

数据结构-顺序存储二叉树

文章目录 目录 文章目录 前言 一 . 什么是顺序存储二叉树 二 . 模拟实现 前序遍历 总结 前言 大家好,今天给大家讲一下顺序存储二叉树 一 . 什么是顺序存储二叉树 顺序存储二叉树是一种将二叉树的节点按照从上到下、从左到右的顺序存储在数组中的方法。具体来说,顺…

Jackson 的 SNAKE_CASE 反序列化

最近项目中有关 JSON 的序列化和反序列化中,我们遇到了一个问题就是 category_id 我们在定义对象的时候使用的是 categoryId。 当程序进行反序列化的时候,我们获得的对象值为 NULL。 这是因为 jackson 提供了一个命名规则,如果你是希望进行…

FISCO BCOS(三十七)———FISCOBCOS应用开发,交易hash、区块高度的获取

这个需求怎么做? 交易hash的获取方式有很多,这里先介绍一种方式。 根据块高查询区块信息 https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/interface.html那我们如何知道现在的区块高度是多少? https://webasedoc.readthedocs.io/zh_CN/latest/docs/W…

谦卑篇(Be humble)//伟大是用卑微来换取的,任何时候都应该看清自己

1. 宇宙诞生138亿年,地球迄今经过了46亿个春秋,人生不过百年,//从生命科学的角度。 2. 蔡崇信:好的领导者是很谦卑的,他们会用谦卑雇佣来能力更强的人。// 从创业者的角度。 3. 《臣服实验》: 臣服生命之流…

新版Ai企业级系统去授权版本完美运行

Ai企联系统去授权版新鲜出炉 一款市面上新出的AI企联系统,一款市面上新出的AI企联系统 项目uniapp开发的,支持3.5 4.0 Mj 此套系统5端适配,WebH5微信小程序抖音小程序双端APP,支持流量主! 好像有能力的快手小程序那些也可以上…

高通camx开源部分学习简介

camera整体框架 sensor 上电,通过 MIPI协议传输,得到RAW图像数据。RAW图像数据经过ISP处理,得到YUV图像数据。YUV图像数据再经过DMA传输到DDR内存中,DDR内存也就是上图中标识的HOST。每个厂家的 ISP原理和功能大致相同&#xff0c…

Qt中 QMap 类、QHash 类、QVector 类详解

目录 一、QMap 类 1.插入数据信息 2.删除数据信息 3.迭代器 4.STL类型迭代 5.key键/T键查找 6.修改键值 7. 一个键对应多个值 直接使用QMultiMap类来实例化一个QMap对象 二、QHash 类 三、QVector类 一、QMap 类 QMap<Key,T>提供一个从类型为 Key 的键到类型为…

制作电商页面(Html)

任务 制作一个电商页面&#xff0c;要求所卖物品清晰&#xff0c;页面色调清晰&#xff0c;要有主页和详情页。 网站所买物品&#xff1a;书籍 色调&#xff1a;#FF2400 橙红色 代码 主页HTML代码&#xff1a; <html><head><meta charset"utf-8"…

力扣 -- 647. 回文子串

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int countSubstrings(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));//无需初始化int ret0;//一定要从下往上填写每一行for(int in-1;i>0;i--){//每一行的i…

Selenium基础

最近在学习爬虫的有关知识&#xff0c;发现一个很有意思的工具Selenium&#xff0c;所以打算花点时间看Selenium提供的手册来学习&#xff0c;为了防止以后忘记和方便复习&#xff0c;打算记录一下我的学习过程&#xff0c;我使用的Selenium版本是4.8.2。 目录 Selenium概述 网…

C++设计模式-享元(Flyweight)

目录 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 运用共享技术有效地支持大量细粒度的对象。 二、适用性 一个应用程序使用了大量的对象。完全由…

【RabbitMQ】初识消息队列 MQ,基于 Docker 部署 RabbitMQ,探索 RabbitMQ 基本使用,了解常见的消息类型

文章目录 前言一、初识消息队列 MQ1.1 同步通信1.2 异步通信1.3 MQ 常见框架及其对比 二、初识 RabbitMQ2.1 什么是 RabbitMQ2.2 RabbitMQ 的结构 三、基于 Docker 部署 RabbitMQ四、常见的消息类型五、示例&#xff1a;在 Java 代码中通过 RabbitMQ 发送消息5.1 消息发布者5.2…