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.hqwc.cn/news/128438.html

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

相关文章

面试算法21:删除倒数第k个节点

题目 如果给定一个链表,请问如何删除链表中的倒数第k个节点?假设链表中节点的总数为n,那么1≤k≤n。要求只能遍历链表一次。 例如,输入图4.1(a)中的链表,删除倒数第2个节点之后的链表如图4.1&a…

33 WEB漏洞-逻辑越权之水平垂直越权全解

目录 前言水平,垂直越权,未授权访问Pikachu-本地水平垂直越权演示(漏洞成因)墨者水平-身份认证失效漏洞实战(漏洞成因)原理越权检测-Burpsuite插件Authz安装测试(插件使用)修复防御方案 前言 越权漏洞文章分享:https://www.cnblogs.com/zhen…

医学专题--多组学在药物治疗靶点筛选中的研究思路

研究背景 药物靶点(drug target):是指药物在体内的作用结合位点,包括基因位点、受体、酶、离子通路、核酸等生物大分子,靶向药物从单靶点药物到多靶点药物都在不断进行临床探索。小分子多靶点药物因其多靶向性、高效率…

如何选择UMLChina服务

服务口号:聚焦最后一公里 斐力庇第斯从马拉松跑回雅典报信,虽然已是满身血迹、精疲力尽,但他知道:没有出现在雅典人民面前,前面的路程都是白费。 学到的知识如果不能最终【用】于您自己的项目之中,也同样是…

ARM-流水灯

.text .global _start _start: 1、设置GPIOE寄存器的时钟使能 RCC_MP_AHB$ENSETR[4]->1 0x50000a28LDR R0,0X50000A28 LDR R1,[R0] 从R0起始地址的4字节数据取出放在R1 ORR R1,R1,#(0X3<<4) 第4位设置为1 STR R1,[R0] 写回2、设置PE10、PE8、PF10管脚为输出模式 …

Java反射(一)--- 类的实例化

文章目录 一、整理框架二、Java反射机制提供的功能三、反射相关的主要API四、相关代码&#xff1a;1.Person类2.反射之前&#xff0c;对于Person类的操作3.反射之后&#xff0c;对于Person类的操作 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、整…

ES6——知识点记录

1.字符串支持 1.codePointAt——根据字符串码元的位置得到其码点 2.includes——判断字符串中是否包含指定的子字符串 3.startsWith——判断字符串中是否以指定的字符串开始 4.endsWith——判断字符串中是否以指定的字符串结尾 5.repeat——将字符串重复指定的次数&#xff0c…

95、Spring Data Redis 之使用RedisTemplate 实现自定义查询 及 Spring Data Redis 的样本查询

Spring Data Redis 之使用RedisTemplate 实现自定义查询 Book实体类 原本的接口&#xff0c;再继承我们自定义的接口 自定义查询接口----CustomBookDao 实现类&#xff1a;CustomBookDaoImpl 1、自定义添加hash对象的方法 2、自定义查询价格高于某个点的Book对象 测试&a…

NewStarCTF 2023 WEEK1|PWN ret2text

拖进IDA&#xff0c;查看 int __cdecl main(int argc, const char **argv, const char **envp) {char buf[32]; // [rsp0h] [rbp-20h] BYREFinit();puts("Welcome to NewStar CTF!!");puts("Show me your magic");read(0, buf, 0x100uLL);return 0; } ma…

PyQt5配置踩坑

安装步骤比较简单&#xff0c;这里只说一下我踩的坑&#xff0c;以及希望一些大佬可以给点建议。 一、QtDesigner 这个配置比较简单&#xff0c;直接就能用&#xff0c;我的配置如下图&#xff1a; C:\Users\lenovo\AppData\Roaming\Python\Python311\site-packages\qt5_app…

人脸动作迁移——基于DaGAN深度感知的生成对抗网络操作对口型数字人

前言 口播视频生成旨在合成具有源图像和驱动视频的身份和姿势信息的协同人脸视频。现有方法主要依赖于从输入图像中学到的二维表示&#xff08;如外观和运动&#xff09;&#xff0c;但密集的三维面部几何信息&#xff08;如像素深度&#xff09;对任务至关重要。这有助于生成…

上门按摩小程序|同城上门按摩软件开发|上门按摩系统;

上门按摩小程序的开发具有许多优势&#xff0c;下面就给大家介绍下按摩小程序功能: 上门按摩小程序的优势 方便快捷&#xff1a;上门按摩小程序提供在线预约服务&#xff0c;用户可以通过手机随时随地预约按摩师上门服务&#xff0c;避免了传统预约方式的繁琐和不确定性。 个性…