
路由是URI到函数的映射。
一个URI含: http://localhost:8080/user/find?id=11
- 协议,比如http,https等
- ip端口或者域名,比如127.0.0.1:8080或者
www.test.com
- path,比如 /path
- query,比如 ?query
同时访问的时候,还需要指明HTTP METHOD,比如
-
GET
GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.(查询)
-
POST
POST方法用于将实体提交到指定的资源,通常会导致在服务器上的状态变化(新增)
-
HEAD
HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
-
PUT
PUT方法用请求有效载荷替换目标资源的所有当前表示
-
DELETE
DELETE方法删除指定的资源
-
CONNECT
CONNECT方法建立一个到由目标资源标识的服务器的隧道。
-
OPTIONS
OPTIONS方法用于描述目标资源的通信选项。
-
TRACE
TRACE方法沿着到目标资源的路径执行一个消息环回测试。
-
PATCH
PATCH方法用于对资源应用部分修改。
使用的时候,应该尽量遵循其语义
1. RESTful API规范
RESTful API 的规范建议我们使用特定的HTTP方法来对服务器上的资源进行操作。
比如:
- GET,表示读取服务器上的资源 (查)
- POST,表示在服务器上创建资源 (增)
- PUT,表示更新或者替换服务器上的资源 (改)
- DELETE,表示删除服务器上的资源 (删)
- PATCH,表示更新/修改资源的一部分
2. 请求方法
比如
go
r.GET("/get", func(ctx *gin.Context) {
ctx.JSON(200, "get")
})
r.POST("/post", func(ctx *gin.Context) {
ctx.JSON(200, "post")
})
r.DELETE("/delete", func(ctx *gin.Context) {
ctx.JSON(200, "delete")
})
r.PUT("/put", func(ctx *gin.Context) {
ctx.JSON(200, "put")
})
如果想要支持所有:
go
r.Any("/any", func(ctx *gin.Context) {
ctx.JSON(200, "any")
})
如果想要支持其中的几种:
go
r.GET("/hello", func(ctx *gin.Context) {
//数组 map list 结构体
ctx.JSON(200, gin.H{
"name": "hello world",
})
})
r.POST("/hello", func(ctx *gin.Context) {
//数组 map list 结构体
ctx.JSON(200, gin.H{
"name": "hello world",
})
})
3. URI
URI书写的时候,我们不需要关心scheme和authority这两部分,我们主要通过path和query两部分的书写来进行资源的定位。
-
静态url,比如
/hello
,/user/find
gor.POST("/user/find", func(ctx *gin.Context) { })
-
路径参数,比如
/user/find/:id
gor.POST("/user/find/:id", func(ctx *gin.Context) { param := ctx.Param("id") ctx.JSON(200, param) })
-
模糊匹配,比如
/user/*path
gor.POST("/user/*path", func(ctx *gin.Context) { param := ctx.Param("path") ctx.JSON(200, param) })
4. 处理函数
定义:
go
type HandlerFunc func(*Context)
通过上下文的参数,获取http的请求参数,响应http请求等。
5. 分组路由
在进行开发的时候,我们往往要进行模块的划分,比如用户模块,以user开发,商品模块,以goods开头。
或者进行多版本开发,不同版本之间路径是一致的,这种时候,就可以用到分组路由了。
比如
go
ug := r.Group("/user")
{
ug.GET("find", func(ctx *gin.Context) {
ctx.JSON(200, "user find")
})
ug.POST("save", func(ctx *gin.Context) {
ctx.JSON(200, "user save")
})
}
gg := r.Group("/goods")
{
gg.GET("find", func(ctx *gin.Context) {
ctx.JSON(200, "goods find")
})
gg.POST("save", func(ctx *gin.Context) {
ctx.JSON(200, "goods save")
})
}