路由概述
路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。
RESTful API 是目前比较成熟的一套互联网应用程序的 API 设计理论,所以我们设计我们的路 由的时候建议参考 RESTful API 指南。
在 RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:
只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互
例如,我们现在要编写一个学生管理系统,我们可以对一个学生进行查询、创建、更新和删除等操作,我们在编写程序的时候就要设计客户端浏览器与我们Web服务端交互的方式和路径。按照RESTful API我们通常会设计成如下模式:
请求方法 | URL | 含义 |
---|---|---|
GET | /student | 查询学生信息 |
POST | /create_student | 创建学生信息 |
PUT | /updata_student | 更新学生信息 |
DELETE | /delete_student | 删除学生信息 |
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/student", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "查询学生信息成功",
})
})
r.POST("/create_student", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "创建学生信息成功",
})
})
r.PUT("/updata_student", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "更新学生信息成功",
})
})
r.DELETE("/delete_student", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "删除学生信息成功",
})
})
r.Run()
}
开发RESTful API的时候我们通常使用postman来做为客户端的测试工具
普通路由
简单的路由配置(可以通过 postman 测试)
当用 GET 请求访问一个网址的时候,做什么事情:
r.GET("网址", func(c *gin.Context) { c.String(200, "Get")
})
当用 POST 访问一个网址的时候,做什么事情:
r.POST("网址", func(c *gin.Context) { c.String(200, "POST")
})
当用 PUT 访问一个网址的时候,执行的操作:
r.PUT("网址", func(c *gin.Context) { c.String(200, "PUT")
})
当用 DELETE 访问一个网址的时候,执行的操作:
r.DELETE("网址", func(c *gin.Context) { c.String(200, "DELETE")
})
路由里面获取 Get 传值 域名/news?aid=20
r.GET("/news", func(c *gin.Context) { aid := c.Query("aid") c.String(200, "aid=%s", aid)
})
动态路由
域名/user/20
r.GET("/user/:uid", func(c *gin.Context) { uid := c.Param("uid")
c.String(200, "userID=%s", uid)
})
总结: 普通路由
r.GET("/get",func(c *gin.Context) {})
r.GET("/login",func(c *gin.Context) {})
r.POST("/login",func(c *gin.Context) {})
此外,还有一个可以匹配所有请求方法的Any方法如下
r.Any("/test",func(c *gin.Context) {})
为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,以下为没有匹配到路由的请求返回的是templates/404.html
页面
r.NoRoute(func(c *gin.Context) {
c.HTML(http.StatusNotFound,"templates/404.html",nil)
})
路由组
我们可以将拥有共同前缀URL的路由划分为一个路由组
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
user := r.Group("/user")
user.GET("/index", func(c *gin.Context) {})
user.POST("/login", func(c *gin.Context) {})
r.Run()
}
路由组也是支持嵌套的
func main() {
r := gin.Default()
user := r.Group("/user")
user.GET("/index", func(c *gin.Context) {})
user.POST("/login", func(c *gin.Context) {})
pwd:=user.Group("/pwd")
pwd.GET("/pwd",func(c *gin.Context) {})
r.Run()
}