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

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

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

相关文章

Thymeleaf 内联语法使用教程

1 表达式内联 Thymeleaf标准方言允许使用标签属性(th:)来实现很多的功能,但在有些场景之下,需要将表达式直接写入HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起,分能不开,待验证,有验证的朋友可…

notion + nextjs搭建博客

SaaS可以通过博客来获得SEO流量,之前我自己在nextjs上,基于MarkDown Cloudfare来构建博客,很快我就了解到更优雅的方案:notion nextjs搭建博客,之前搭建了过,没有记录,这次刚好又要弄&#xf…

Cocos Creator3.8 项目实战(七)Listview 控件的实现和使用

滚动列表在游戏中也很常见,比如排行榜 、充值记录等,在这些场景中,都有共同的特点, 那就是:数据量大 , 结构相同。 在cocoscreator 中,没有现成的 Listview 控件, 无奈之下&#xff…

Python数据攻略-数据特征处理离散化和二值化

在数据分析和机器学习中,数据预处理是一个非常重要的步骤。一种常见的数据预处理方法是数据离散化和二值化。但是这两个词可能会让初学者感到困惑。 数据离散化:简单地说,就是将连续的数值分成几个区间,并用这些区间的标签来代替原始值。数据二值化:则是把所有数值转换为0…

Java — 堆内存、新生代、老年代 一般设置为多大内存?

置顶 学习专栏:【Java后端面试题】 1.Java面试题—基础知识、面向对象、【容器】、IO & 【设计模式】、泛型 & 异常 & 反射 & 注解、快速排序2.Java面试题—并发基础、【同步 & 互斥】、JUC & 并发容器、【线程池】、异步编程、【Lambda表达…

【JavaEE重点知识归纳】第5节:方法

目录 一:方法的概念和使用 1.什么是方法 2.方法的定义 3.方法的调用过程 4.实参和形参的关系(重点) 二:方法重载 1.方法重载概念 2.方法签名 三:递归 1.递归的概念 2.递归执行的过程分析 一:方法的概念和使…

[开源项目推荐]privateGPT使用体验和修改

文章目录 一.跑通简述二.解读ingest.py1.导入库和读取环境变量2.文档加载3.文档处理(调用文件加载函数和文本分割函数) 三.injest.py效果演示1.main函数解读2.测试 四.修改代码,使之适配多知识库需求1.修改配置文件:constants.py2…

CSS背景图片自适应大小

在CSS中,如果你想让背景图片自适应元素的大小,你可以使用background-size属性。以下是一些示例: 如果你想让背景图片完全填充元素,但不保持原始比例,可以使用cover值: .element {background-image: url(y…

Elasticsearch:ES|QL 查询语言简介

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。在目前的 Elastic Stack 8.10 中此功能还没有提供。 Elasticsearch 查询语言 (ES|…

IntelliJ IDEA 常用快捷键

目录 一、IDEA 常用快捷键 1 通用型 2 提高编写速度 3 类结构、查找和查看源码 4 查找、替换与关闭 5 调整格式 二、Debug快捷键 三、查看快捷键 1、已知快捷键操作名,未知快捷键 2、已知快捷键,不知道对应的操作名 3、自定义快捷键 4、使用…

pip命令大全

pip --version 查看已经安装了的pip版本 pip install -U pip 升级pip pip install --upgrade pip 升级pip pip list 或 pip freeze 查看当前已经安装好了包及版本 pip list -o 查看需要被升级的包 pip install package_name(包名) 下载安装包 pip install matplotlib3.4.…

MyBatisPlus(十一)包含查询:in

说明 包含查询&#xff0c;对应SQL语句中的 in 语句&#xff0c;查询参数包含在入参列表之内的数据。 in Testvoid inNonEmptyList() {// 非空列表&#xff0c;作为参数List<Integer> ages Stream.of(18, 20, 22).collect(Collectors.toList());in(ages);}Testvoid in…

[强网杯 2022]factor有感

可直接私信&#xff0b;Q 3431550587 此题记录主要是他运用了几个新看见的攻击思路和拜读了一篇论文&#xff0c;所以写写。题目源码&#xff1a; #encoding:utf-8 from Crypto.Util.number import * from gmpy2 import * from random import randint from flag import flagd…

[编程思想录]无锁之CAS

一、背景 解决线程并发产生的问题,除了锁,volatile等关键字之外,在特定的情景下为了提高代码运行的效率,为了摆脱“锁”这个独占式的编程方式之外,还有另外一个原子类的概念。 在java.util.concurrent.atomic包下有Java提供的线程安全的原子类,比如AtomicInteger。而这些…

list中符合 多条件中筛选符合条件的值

//查找身高在1.8米及以上的男生 // List<SsxlwdBean> boys list.stream().filter(s->s.getGender() && s.getHeight() > 1.8).collect(Collectors.toList()); xlseachitem list.stream().filter(list->list.xlname.contains(Upstrquery)||list.xlbm.…

AGI之MFM:《多模态基础模型:从专家到通用助手》翻译与解读之视觉理解、视觉生成

​AGI之MFM&#xff1a;《Multimodal Foundation Models: From Specialists to General-Purpose Assistants多模态基础模型&#xff1a;从专家到通用助手》翻译与解读之视觉理解、视觉生成 目录 相关文章 AGI之MFM&#xff1a;《Multimodal Foundation Models: From Speciali…

【Docker内容大集合】Docker从认识到实践再到底层原理大汇总

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

硬盘损坏不能用怎么办?

硬盘是电脑的核心&#xff0c;如果硬盘出现了问题&#xff0c;那么整台电脑都会受到影响&#xff0c;电脑中的数据也会丢失。那么面对硬盘损坏时我们该如何解决呢&#xff1f;本文今天用5种简单的方法帮您解决&#xff01; 1、硬盘连接是否松动 当电脑的硬盘突然表现出无法识别…

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结 一、139.单词拆分 题目链接&#xff1a;https://leetcode.cn/problems/word-break/ 思路&#xff1a;单词拼字符串&#xff0c;完全背包。定义dp[i]&#xff0c;为true表示可以拆分为一或多个单词。可能会出现ab…

Python学习之——测试环境路径的工程示例

Python学习之——测试环境路径的工程示例 Python环境路径几点小结一个工程示例 Python环境路径 参考&#xff1a; Python模块导入与路径管理 1.对于一个纯Python工程, 在 import模块时&#xff0c;Python解释器的搜索顺序是先搜索built-in模块&#xff0c;然后搜索 sys.path这…