Go语言Web开发技巧:深入Trie参数路由

发表时间: 2019-12-06 20:13

背景

在之前的上一篇文章通配符的改造之下,我们的Trie已经初步具备了路由功能,虽然还有bug但是并不影响我们对参数路由原理的了解,也会帮助我们后面学习httprouter,或者gin等高级优秀框架的golang web框架的学习,本小节主要完成参数绑定这个工作,做一些少许的改动就可以完成基本功能


本小节可以一起学习到的知识有

  1. 一个简单的支持restful的参数绑定功能
  2. golang web服务端获取到get和post请求之后,如何修改或者说如何新增参数
  3. golang中方法作为参数传递,方法属于一等公民


代码调整

1.Node数据结构调整

因为我们如果用通配符匹配到正确的参数之后,我们需要进行参数绑定,举例来说,我们之前设定了"/user/group/:id"之后,当有"/user/group/22"请求到来的时候,我们要知道id=22,然后把这个参数偷偷的塞到请求参数中,所以我们在search方法中匹配到路径之后,要记录参数,首先我们先改造Node结构,新增2个参数,一个是map结构,记录id=22这类的请求参数,还有一个参数就是Handler


Handler这个我们重点描述一下,比较特殊,handler是一个方法,在java中,在java8的时候才支持方法参数化,不过在golang中方法却是一等公民,这个以后我们会经常讲方法作为参数传递

2.search方法的改造

search方法的改造就是获取restful风格URL路径中的参数,将解析到的参数绑定到map中去,相对比较简单,不赘述,修改点我已经在源码中标注了

路由改造

我们修改一下main函数,首先先添加一个路由,"/get/user/:id"这种url处理的handler叫做getUserById,然后我们使用golang原生的http方法,绑定一个跟路由,表示我们处理所有类型的请求,只是我们这个router方法不做具体的业务逻辑处理,只是简单的进行子方法匹配和参数绑定功能


router方法如下,使用request.RequestURI方法之后,这边主要是调用之前写的Trie的search方法,因为我们之前改造过search方法,如果是通配符匹配的话,就会绑定uri中的参数,接下来我们要做的事情就是把解析到的参数偷偷塞到原有的请求体中去

GET方法偷偷塞方法体代码如下

POST方法偷偷塞参数到原始参数如下

最后调用node节点中的一等公民Handler

getUserById的逻辑就比较简单,获取到请求的用户id,返回一个json就可以了

测试

1.postmanGet请求

2.postman POST请求

小结

说下自己心得吧,其实个人觉得这个知识点挺重要的,既能够学习到一种数据结构Trie,也能够吧参数绑定的功能入个门,也能够了解restful这种风格的逻辑处理,并且也进一步熟悉了golang http模块的知识,还是有一点收获的吧,虽然上述写的代码bug很多,逻辑缺陷也有,但这并不妨碍我们了解这边的知识点,接下来我们将学习golang如何操作mysql数据库


如果你也是一个golang爱好者,如果想一起学习的话,可以点一个关注,接下来的日子大家一起学习讨论,谢谢~ (不贴github地址了,如果有需要可以私信我)