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 files

PART1. 获取参数值

之前已经实现了参数路径的注册与查找,但仍有一个核心问题没有解决:我们没有办法将参数从路由中带到逻辑处理函数中.

1.1 定义新类型

我们现在定义的node结构体是不包含参数路径中的参数名和参数值的.因此我们需要新定义一个类型,该类型除了表示命中的路由节点外,还包含该节点的参数名和参数值(如果该节点是参数路径节点的话)

matchNode.go:

注:这里我认为代码中出现Info之类的指代意义不明的单词不太好,因此将老师上课时命名的matchInfo修改为了matchNode.

1.2 修改chlidOf()方法

该方法需要再返回一个标识该节点是否为参数路径节点的标量

node.go:

1.3 修改findRoute()方法

1.3.1 为matchNode结构体新增方法

matchNode.go:新增一个用于添加路径参数的方法addPathParams()

1.3.2 修改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()方法

因为findRoute()方法的返回值有变动而造成的修改.

2.2 运行测试用例

此处运行2.1.4小节的测试用例即可

PART3. 将参数名/值传递至业务处理函数

到目前为止,我们只是拿到了参数路径中的名值对,还没有实现让业务处理函数获取到这个名值对的功能.

3.1 修改Context

context.go:

3.2 命中节点后将名值对传递给Context

httpServer.go:

PART4. 参数路径的冲突问题

4.1 问题的产生

思考这样一个问题:我们是否允许形如/user/:id/user/:name同时存在?

答案显而易见:肯定是不支持两个路由同时存在的.

4.2 修改childOrCreate()方法

node.go:

4.3 测试

router_test.go:

Last updated