Go学习笔记: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方法来对服务器上的资源进行操作。

比如:

  1. GET,表示读取服务器上的资源 (查)
  2. POST,表示在服务器上创建资源 (增)
  3. PUT,表示更新或者替换服务器上的资源 (改)
  4. DELETE,表示删除服务器上的资源 (删)
  5. 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

    go 复制代码
    r.POST("/user/find", func(ctx *gin.Context) {
    })
  • 路径参数,比如/user/find/:id

    go 复制代码
    r.POST("/user/find/:id", func(ctx *gin.Context) {
    		param := ctx.Param("id")
    		ctx.JSON(200, param)
    	})
  • 模糊匹配,比如/user/*path

    go 复制代码
    r.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")
		})
	}
相关推荐
Rhys..17 分钟前
python + Flask模块学习 1 基础用法
python·学习·前端框架·flask
lingggggaaaa23 分钟前
小迪安全v2023学习笔记(七十八讲)—— 数据库安全&Redis&CouchDB&H2database&未授权&CVE
redis·笔记·学习·算法·安全·网络安全·couchdb
Source.Liu26 分钟前
【Python基础】 13 Rust 与 Python 注释对比笔记
开发语言·笔记·python·rust
诗句藏于尽头32 分钟前
DJANGO后端服务启动报错及解决
数据库·笔记·django
Jayyih1 小时前
嵌入式系统学习Day29(tcp)
网络·学习·tcp/ip
汇能感知2 小时前
光谱相机的探测器类型
经验分享·笔记·科技
007php0072 小时前
Go语言面试:传值与传引用的区别及选择指南
java·开发语言·后端·算法·面试·golang·xcode
g_i_a_o_giao2 小时前
Android8 binder源码学习分析笔记(一)
android·java·笔记·学习·binder·安卓源码分析
c萱2 小时前
软件测试错题笔记
软件测试·数据库·笔记·测试工具·oracle·测试用例
Joy T2 小时前
雨后阳光为何更强烈?
笔记·环境科学·有趣的环境现象