3.11 路由树-参数路径之参数值
本节课工程结构如下:
(base) yanglei@yuanhong 16-valueOfParamRoute % tree ./
./
├── context.go
├── handleFunc.go
├── httpServer.go
├── httpServer_test.go
├── matchNode.go
├── node.go
├── router.go
├── router_test.go
└── serverInterface.go
0 directories, 9 filesPART1. 获取参数值
之前已经实现了参数路径的注册与查找,但仍有一个核心问题没有解决:我们没有办法将参数从路由中带到逻辑处理函数中.
1.1 定义新类型
我们现在定义的node结构体是不包含参数路径中的参数名和参数值的.因此我们需要新定义一个类型,该类型除了表示命中的路由节点外,还包含该节点的参数名和参数值(如果该节点是参数路径节点的话)
matchNode.go:
注:这里我认为代码中出现Info之类的指代意义不明的单词不太好,因此将老师上课时命名的matchInfo修改为了matchNode.
1.2 修改chlidOf()方法
chlidOf()方法该方法需要再返回一个标识该节点是否为参数路径节点的标量
node.go:
1.3 修改findRoute()方法
findRoute()方法1.3.1 为matchNode结构体新增方法
matchNode结构体新增方法matchNode.go:新增一个用于添加路径参数的方法addPathParams()
1.3.2 修改findRoute()方法
findRoute()方法这里findRoute()方法就不能再返回node了,因为需要将参数名/值和节点一起返回.因此需要返回matchNode类型.
既然chlidOf()方法已经返回了表达当前节点是否为参数路径节点的标量,那么findRoute()方法需要做的事情就是:若当前节点为参数路径节点,则将参数名和参数值一同返回
router.go:
PART2. 测试
2.1 修改已有的测试用例
2.1.1 修改路由查找功能的测试用例
这个用例其实并没有运行,就是为了编译通过而修改.因为这个用例里没有测试参数路径匹配.
router_test.go:
2.1.2 通配符路由查找功能的测试用例
这个用例其实并没有运行,就是为了编译通过而修改.因为这个用例里也没有测试参数路径匹配.
router_test.go:
2.1.3 针对参数路由查找功能的测试用例
2.1.4 修改serve()方法
serve()方法因为findRoute()方法的返回值有变动而造成的修改.
2.2 运行测试用例
此处运行2.1.4小节的测试用例即可
PART3. 将参数名/值传递至业务处理函数
到目前为止,我们只是拿到了参数路径中的名值对,还没有实现让业务处理函数获取到这个名值对的功能.
3.1 修改Context
Contextcontext.go:
3.2 命中节点后将名值对传递给Context
ContexthttpServer.go:
PART4. 参数路径的冲突问题
4.1 问题的产生
思考这样一个问题:我们是否允许形如/user/:id和/user/:name同时存在?
答案显而易见:肯定是不支持两个路由同时存在的.
4.2 修改childOrCreate()方法
childOrCreate()方法node.go:
4.3 测试
router_test.go:
Last updated