Gin路由高级

Gin路由高级

路由分组

routes group是为了管理一些相同的URL

package main

import (
   "fmt"
   "github.com/gin-gonic/gin"
)

// gin的helloWorld

func main() {
   // 1.创建路由
   r := gin.Default()
   // 路由组1 ,处理GET请求
   v1 := r.Group("/v1")
   // {} 是书写规范,不写也可以
   {
      v1.GET("/login", login)
      v1.GET("submit", submit) //   /不写也可以
   } 
   v2 := r.Group("/v2")

   v2.POST("/login", login)
   v2.POST("/submit", submit)

   r.Run(":8000")
}

func login(c *gin.Context) {
   name := c.DefaultQuery("name", "lqz")
   c.String(200, fmt.Sprintf("hello %s\n", name))
}

func submit(c *gin.Context) {
   name := c.DefaultQuery("name", "pyy")
   c.String(200, fmt.Sprintf("hello %s\n", name))
}

测试

get请求:127.0.0.1:8000/v1/login
post请求:127.0.0.1:8000/v1/submit

get请求:127.0.0.1:8000/v2/login
post请求:127.0.0.1:8000/v2/submit

路由拆分与注册

基本路由注册

适用于路由比较少的简单项目, 将路由放到 别的文件中,在 main 包中调用即可

routers.go
package main
import (
   "net/http"
   "github.com/gin-gonic/gin"
)

func helloHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "msg": "www.lxx.top",
   })
}
func testHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "status":100,
      "msg": "hello world",
   })
}

func initRouter() *gin.Engine {
   r := gin.Default()
   r.GET("/hello", helloHandler)
   r.GET("/test", testHandler)
   return r
}
main.go
package main

func main() {
   r := initRouter() // 调用方法得到 路由对象,再运行
   r.Run()
}

//访问
//http://127.0.0.1:8080/test
http://127.0.0.1:8080/hello

拆分到包中

目录结构

在这里插入图片描述

routers/routers.go

routers/routers.go需要注意此时initRouter需要改成首字母大写:

package routers
import (
   "net/http"
   "github.com/gin-gonic/gin"
)

func helloHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "msg": "www.lxx.top",
   })
}
func testHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "status":100,
      "msg": "hello world",
   })
}

func InitRouter() *gin.Engine {
   r := gin.Default()
   r.GET("/hello", helloHandler)
   r.GET("/test", testHandler)
   return r
}
main.go
package main

import "gin_test/routers"

func main() {
   r := routers.InitRouter()
   r.Run()
}

路由拆分成多个文件

单独的一个routers文件或包已经满足不了我们的需求了

目录结构

在这里插入图片描述

routers/goods.go

package routers

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func LoadGoodsRouters(r *gin.Engine)  {
   good := r.Group("/good")
  {
   good.GET("/", goodHandler)
   good.GET("/goodlist", goodlistHandler)
   good.GET("/updategood", updategoodHandler)
  }
}
func goodHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "msg": "www.lxx.top",
   })
}

func goodlistHandler(c *gin.Context) {
   c.String(http.StatusOK, "goodlistHandler")
}
func updategoodHandler(c *gin.Context) {
   c.String(http.StatusOK, "updategoodHandler")
}

routers/order.go

package routers

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func LoadOrderRouters(r *gin.Engine)  {
   order := r.Group("/order")
  {
 	 order.GET("/", orderHandler)
   order.GET("/orderlist", orderlistHandler)
   order.GET("/updateorder", updateorderHandler)
  }
}
func orderHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "msg": "www.lxx.top",
   })
}

func orderlistHandler(c *gin.Context) {
   c.String(http.StatusOK, "orderlistHandler")
}
func updateorderHandler(c *gin.Context) {
   c.String(http.StatusOK, "updateorderHandler")
}

routers/user.go

package routers

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func LoadUserRouters(r *gin.Engine)  {
   user := r.Group("/user")
  {
   user.GET("/", userHandler)
   user.GET("/userlist", userlistHandler)
   user.GET("/updateuser", updateuserHandler)
  }
}
func userHandler(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "msg": "www.lxx.top",
   })
}

func userlistHandler(c *gin.Context) {
   c.String(http.StatusOK, "userlistHandler")
}
func updateuserHandler(c *gin.Context) {
   c.String(http.StatusOK, "updateuserHandler")
}

main.go

package main

import (
   "gin_test/routers"
   "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   routers.LoadGoodsRouters(r)
   routers.LoadOrderRouters(r)
   routers.LoadUserRouters(r)
   r.Run()
}

路由拆分到不同的APP

有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP。

因此我们在项目目录下单独定义一个app目录,用来存放我们不同业务线的代码文件,这样就很容易进行横向扩展。大致目录结构如下:
在这里插入图片描述

app01/shop/handler.go

package shop


import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func shopHandler(c *gin.Context)  {
   c.String(http.StatusOK, "shopHandler")
}

func shopInfoHandler(c *gin.Context)  {
   c.String(http.StatusOK, "shopInfoHandler")
}

app01/shop/router.go

package shop

import "github.com/gin-gonic/gin"

func Routers(e *gin.Engine) {
   e.GET("/shop", shopHandler)
   e.GET("/shopinfo", shopInfoHandler)
}

app01/user/handler.go

package user

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func userHandler(c *gin.Context)  {
   c.String(http.StatusOK, "userHandler")
}

func userInfoHandler(c *gin.Context)  {
   c.String(http.StatusOK, "userInfoHandler")
}

app01/user/router.go

package user


import "github.com/gin-gonic/gin"

func Routers(e *gin.Engine) {
   e.GET("/user", userHandler)
   e.GET("/userinfo", userInfoHandler)
}

routers/routers.go

package routers

import "github.com/gin-gonic/gin"

// 定义一个路由函数切片
type Option func(e *gin.Engine)
var options = []Option{}
// 将各个路由函数追加 切片中
func Include(opts ...Option) {
	options = append(options, opts...)
}

// 初始化,循环执行路由函数
func Init() *gin.Engine  {
	r := gin.Default()
	for _,opt := range options{
		opt(r)
	}
	return r
}

main.go

package main

import (
   "gin_test/app01/shop"
   "gin_test/app01/user"
   "gin_test/routers"
)

func main() {
   routers.Include(shop.Routers,user.Routers)
   r:=routers.Init()
   r.Run()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值