c.Request.URL.Path 拿到请求的路径
packagemain
import(
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
//路由重定向,请求转发,ANY,NoRoute,路由组
funcmain(){
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:任意httpmethod(适用于restful,因为有同名的不同httpmethod的方法)---------------------
//路径为/test的,不管是GET还是POST或者PUT等,均路由到这里
r.Any("/test",func(c*gin.Context){
switchc.Request.Method{
casehttp.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()
//gofunc(){
//r.Run()
//}()
//select{}
}
路由重定向
转发
Any: 捕获同名接口的任意http method
多方式匹配,包括:
GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE
NoRoute: 当匹配不到路径时到这里
路由组
默认区分大小写
通配符匹配
对于接口 /v1/say/xxxx接口(POST方法,参数为body里传一个name类型的json),当say后面为任意字符时,均路由到helloHandler方法进行处理
packagemain
import(
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
//Param请求参数
typeParamstruct{
Namestring`json:"name"`
}
//helloHandler/hello请求处理函数
funchelloHandler(c*gin.Context){
varpParam
iferr:=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路由
funcSetupRouter()*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)
returnrouter
}
funcmain(){
g:=SetupRouter()
g.Run()//listenandserveon0.0.0.0:8080
}
*需要加任意字符,但不能不加(只写*
的话会报错)
参考:
Gin框架 路由重定向,请求转发,ANY ,NoRoute,路由组
我给 gin 提交了一行代码
Gin group级别的NoRoute
未知调用方式,静态资源返回,静态资源目录等,可参考 Gola服务器托管网ng Gin 框架 Route备注
两种写法的比较
r.Run()
和
gofunc(){
r.Run()
}()
select{}
第一种方式是同步的,上面的所有路由都加载完,才会运行服务
第二种方式是异步的,假设有这样一种情况,前面的路由解析都很快,但在解析最后几个路由时,特别慢(当然现实情况不太可能)。 那可以把r.Run()以异步的形式写在最上面,即启动服务和加载路由同步进行。 那前面已解析的路由就可以访问了
如:
packagemain
import(
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
//路由重定向,请求转发,ANY,NoRoute,路由组
funcmain(){
r:=gin.Default()
gofunc(){
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:任意httpmethod(适用于restful,因为有同名的不同httpmethod的方法)---------------------
//路径为/test的,不管是GET还是POST或者PUT等,均路由到这里
r.Any("/test",func(c*gin.Context){
switchc.Request.Method{
casehttp.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{}
}
可见,已解析的路由可正常访问,未解析的访问则会404
本文由 mdnice 多平台发布
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 前端学习笔记202310学习笔记第一百零玖天-vue3-链式调用&对象属性与遍历&this指向&caller_callee之37
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.ne服务器托管网t 机房租用,北京机房租用,IDC机房托管, h服务器托管网ttp://www.fwqtg.net相关推荐: 2023年最具威胁的25种安全漏洞(CWE TOP 25)摘…