zoukankan      html  css  js  c++  java
  • Gin框架路由

    Gin框架路由

    一、普通路由

    r.GET("/index", func(c *gin.Context) {...})
    r.GET("/login", func(c *gin.Context) {...})
    r.POST("/login", func(c *gin.Context) {...})
    
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	r := gin.Default()
    	r.HEAD("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "head",
    		})
    
    	})
    	r.GET("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "get",
    		})
    
    	})
    
    	r.POST("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "post",
    		})
    
    	})
    
    	r.PUT("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "put",
    		})
    	})
    	r.PATCH("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "patch",
    		})
    	})
    	r.DELETE("/index", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"method": "delete",
    		})
    	})
    
    	r.Run(":9999")
    }
    
    

    二、Any

    匹配所有请求方法的Any方法如下:

    r.Any("/test", func(c *gin.Context) {...})
    
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	r := gin.Default()
    	
    	// Any: 接收所有请求方式
    	r.Any("/any", func(c *gin.Context) {
    		switch c.Request.Method {
    		case http.MethodGet:
    			c.JSON(http.StatusOK, gin.H{
    				"method": http.MethodGet,
    			})
    		case http.MethodPost:
    			c.JSON(http.StatusOK, gin.H{
    				"method": http.MethodPost,
    			})
    		case http.MethodHead:
    			c.JSON(http.StatusOK, gin.H{
    				"method": http.MethodHead,
    			})
    		case http.MethodDelete:
    			c.JSON(http.StatusOK, gin.H{
    				"method": http.MethodDelete,
    			})
    
    		}
    	})
    
    	r.Run(":9999")
    }
    
    

    三、NoRoute

    为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回views/404.html页面。

    r.NoRoute(func(c *gin.Context) {
    		c.HTML(http.StatusNotFound, "views/404.html", nil)
    	})
    
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	r := gin.Default()
    	
    	// NoRoute:处理不存在的路由
    	r.NoRoute(func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"msg": "访问资源不存在",
    		})
    
    	})
    	r.Run(":9999")
    }
    
    

    四、路由组

    我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	r := gin.Default()
    	
    	// 路由组
    	bookRouteGroup := r.Group("/book")
    	{
    		bookRouteGroup.GET("/details", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "book",
    			})
    		})
    
    		bookRouteGroup.POST("/add", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "add book",
    			})
    		})
    		bookRouteGroup.DELETE("/move", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "delete book",
    			})
    		})
    	}
    
    	r.Run(":9999")
    }
    
    

    五、路由组嵌套

    路由组也是支持嵌套的,例如:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	r := gin.Default()
    	
    	// 路由组嵌套
    	shopRouteGroup := r.Group("/shop")
    	{
    		shopRouteGroup.GET("/details", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "shop",
    			})
    		})
    
    		shopRouteGroup.POST("/add", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "add shop",
    			})
    		})
    
    		// 路由嵌套
    		shopOrderRouteGroup := shopRouteGroup.Group("shopOrder")
    		shopOrderRouteGroup.GET("/details", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "shop order",
    			})
    		})
    
    		shopOrderRouteGroup.POST("/add", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "add shop order",
    			})
    		})
    		shopOrderRouteGroup.DELETE("/move", func(c *gin.Context) {
    			c.JSON(http.StatusOK, gin.H{
    				"msg": "delete shop order",
    			})
    		})
    	}
    
    	// NoRoute:处理不存在的路由
    	r.NoRoute(func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{
    			"msg": "访问资源不存在",
    		})
    
    	})
    	r.Run(":9999")
    }
    
    

    通常我们将路由分组用在划分业务逻辑或划分API版本时。

    六、路由原理

    Gin框架中的路由使用的是httprouter这个库。

    其基本原理就是构造一个路由地址的前缀树。

  • 相关阅读:
    VMWare磁盘配置的问题终于解决了!!
    十种老板不可追随
    关于ASP无组件上传在2003下出错
    设计模式的有趣解释-追MM[转]
    "未能在给定的程序集中找到任何适合于指定的区域性(或非特定区域性)的资源"解决办法
    今天看到了DNN3.0.4,感觉挺不错的,确实有很大的改进!!!
    今天加入了博客园
    一个女孩写的经典程序!!! (转载)
    加了强名后经常出现错误“程序集清单定义与程序集引用不匹配”
    C#写一个URL编码转换GB23121的方法,然后可以取到天气预报
  • 原文地址:https://www.cnblogs.com/randysun/p/15626658.html
Copyright © 2011-2022 走看看