php控制器golang控制器,gin的控制器与路由

1.概述

路由是一个过程,指的是一个http请求,如何找到对应的处理器函数(也可以叫控制器函数),Gin框架的路由是基于httprouter包实现的。

控制器是在路由完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

2.路由定义

2.1.http请求方法

常用的http请求方法有下面4种:

GET

POST

PUT

DELETE

2.2.url路径

gin框架,url路径有三种写法:

静态url路径

带路径参数的url路径

带星号(*)模糊匹配参数的url路径

例子:

// 例子1, 静态Url路径, 即不带任何参数的url路径

/users/center

/user/111

/food/12

// 例子2,带路径参数的url路径,url路径上面带有参数,参数由冒号(:)跟着一个字符串定义。

// 路径参数值可以是数值,也可以是字符串

//定义参数:id, 可以匹配/user/1, /user/899 /user/xiaoli 这类Url路径

/user/:id

//定义参数:id, 可以匹配/food/2, /food/100 /food/apple 这类Url路径

/food/:id

//定义参数:type和:page, 可以匹配/foods/2/1, /food/100/25 /food/apple/30 这类Url路径

/foods/:type/:page

// 例子3. 带星号(*)模糊匹配参数的url路径

// 星号代表匹配任意路径的意思, 必须在*号后面指定一个参数名,后面可以通过这个参数获取*号匹配的内容。

//以/foods/ 开头的所有路径都匹配

//匹配:/foods/1, /foods/200, /foods/1/20, /foods/apple/1

/foods/*path

//可以通过path参数获取*号匹配的内容。

2.3.3.分组路由

在做api开发的时候,如果要支持多个api版本,我们可以通过分组路由来实现api版本处理。

router := gin.Default()

// 创建v1组

v1 := router.Group("/v1")

{

// 在v1这个分组下,注册路由

v1.POST("/login", loginEndpoint)

v1.POST("/submit", submitEndpoint)

v1.POST("/read", readEndpoint)

}

// 创建v2组

v2 := router.Group("/v2")

{

// 在v2这个分组下,注册路由

v2.POST("/login", loginEndpoint)

v2.POST("/submit", submitEndpoint)

v2.POST("/read", readEndpoint)

}

上面的例子将会注册下面的路由信息:

/v1/login

/v1/submit

/v1/read

/v2/login

/v2/submit

/v2/read

路由分组,其实就是设置了同一类路由的url前缀。

3.控制器

路由需要配合控制器才能完成一次请求,下面我们来看一下控制器的定义。

控制器函数定义:

func HandlerFunc(c *gin.Context)

控制器函数接受一个上下文参数。

可以通过上下文参数,获取http请求参数,响应http请求。

下面我们通过一个例子看一下控制器的定义:

//实例化gin实例对象。

r := gin.Default()

//定义post请求, url路径为:/users, 绑定saveUser控制器函数

r.POST("/users", saveUser)

//定义get请求,url路径为:/users/:id (:id是参数,例如: /users/10, 会匹配这个url模式),绑定getUser控制器函数

r.GET("/users/:id", getUser)

//定义put请求

r.PUT("/users/:id", updateUser)

//定义delete请求

r.DELETE("/users/:id", deleteUser)

//控制器函数实现

func saveUser(c *gin.Context) {

...忽略实现...

}

func getUser(c *gin.Context) {

...忽略实现...

}

func updateUser(c *gin.Context) {

...忽略实现...

}

func deleteUser(c *gin.Context) {

...忽略实现...

}

提示:实际项目开发中不要把路由定义和控制器函数都写在一个go文件,不方便维护,可以参考项目结构,规划自己的业务模块。

出处gin从入门到实践更多精彩文章,请关注我的博客SOCKSTACK,分享我的工作经验。

有疑问加站长微信联系(非本文作者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值