Gin框架入门系列【2】路由

116 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1 路由

在之前的文章中已经完成了Gin框架的简单应用,使用Gin框架实现了一个hello world程序,其中最重要部分的代码就是初始化默认路由和绑定路由规则,在Gin框架中这只是最简单的应用,关于路由的使用还有很多需要学习的地方。

1.1 请求

之前我们只使用到了默认路由的GET方法,这次尝试一下另外几种方法。

1.1.1 GET

GET通常用于请求一个指定的页面并返回数据,使用GET方法的路由可查看上一篇文章的内容。

1.1.2 POST

POST和GET都是在日常接口开发中使用到的最多的请求方法之一,POST通常用于向指定资源提交数据进行请求处理。

func main() {
  g := gin.Default()

  g.POST("test_post", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "post ok",
    })
  })

  err := g.Run(":8888")
  if err != nil {
    return
  }
}

上述代码完成了一个最简单的POST请求,通过POST请求并返回JSON数据(关于请求参数和请求体的内容见下一篇文章)

由于浏览器地址栏中默认发送的都是GET请求,所以针对其他请求的测试都采用postman软件,请求结果如下:

1.1.3 PUT

PUT请求通常用于修改请求,例如向服务器提交数据并替换服务器中原有数据。

func main() {
  g := gin.Default()

  g.PUT("test_put", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "put ok",
    })
  })

  err := g.Run(":8888")
  if err != nil {
    return
  }
}

PUT请求的写法和POST写法一致,请求结果如下:

1.1.4 DELETE

DELETE请求用于删除服务器中的资源。

func main() {
  g := gin.Default()

  g.DELETE("test_delete", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "delete ok",
    })
  })

  err := g.Run(":8888")
  if err != nil {
    return
  }
}

请求结果如下:

1.2 路由组

上面了解了不同请求的使用方法,但是在日常的开发过程中,后端开发人员针对某一模块提供的接口往往都是前半部分的路由地址一样,只有最后的请求不一样,针对这样的情况,Gin框架提供了路由组的概念,路由组表示在当前这个路由组中的所有接口都会被加上地址前缀。

1.2.1 之前

在没有使用路由组时,我们的接口可能是这样写的:

g.GET("/api/v1/user/get_user", func(c *gin.Context) {
})

g.POST("/api/v1/user/update_user", func(c *gin.Context) {
})

g.DELETE("/api/v1/user/delete_user", func(c *gin.Context) {
})

通过上面的代码可以发现,在每一个路由地址中,前半部分的 /api/v1/user/ 都是重复的,这个时候就可以使用路由组了。

1.2.2 之后

使用路由组的方法很简单,只需要使用Group方法即可,该方法传入一个路由前缀,在后面的路由绑定时则可使用该路由组,例如下面代码,这样在绑定路由规则时就不用每一个都写上 /api/v1/user 部分。

func main() {
  g := gin.Default()

  user := g.Group("/api/v1/user")

  user.GET("/get_user", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "ok",
    })
  })
  
  user.POST("/update_user", func(c *gin.Context) {
  })
  
  user.DELETE("/delete_user", func(c *gin.Context) {
  })

  err := g.Run(":8888")
  if err != nil {
    return
  }
}

以上代码可访问:http://localhost:8888/api/v1/user/get_user 返回结果,请求结果如下:

在Gin框架中,可以同时存在多个路由组,且在不同的路由组中路由可以重名,例如下面代码通过访问 http://localhost:8888/api/v1/user/get_userhttp://localhost:8888/api/v2/user/get_user 返回的结果是不一样的。

func main() {
  g := gin.Default()

  v1 := g.Group("/api/v1/user")
  v2 := g.Group("/api/v2/user")

  v1.GET("/get_user", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "v1 ok",
    })
  })

  v2.GET("/get_user", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "v2 ok",
    })
  })

  err := g.Run(":8888")
  if err != nil {
    return
  }
}

关注专栏,持续更新……