go框架(2)-gin路由
路由
路由是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. 请求方法
比如
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")
})
如果想要支持所有:
r.Any("/any", func(ctx *gin.Context) {
ctx.JSON(200, "any")
})
如果想要支持其中的几种:
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
r.POST("/user/find", func(ctx *gin.Context) { })
路径参数,比如
/user/find/:id
r.POST("/user/find/:id", func(ctx *gin.Context) { param := ctx.Param("id") ctx.JSON(200, param) })
模糊匹配,比如
/user/*path
r.POST("/user/*path", func(ctx *gin.Context) { param := ctx.Param("path") ctx.JSON(200, param) })
4. 处理函数
定义:
type HandlerFunc func(*Context)
通过上下文的参数,获取http的请求参数,响应http请求等。
5. 分组路由
在进行开发的时候,我们往往要进行模块的划分,比如用户模块,以user开发,商品模块,以goods开头。
或者进行多版本开发,不同版本之间路径是一致的,这种时候,就可以用到分组路由了。
比如
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")
})
}