go-restful库是一个用go语言实现的REST风格的Web服务框架,
1 关键数据结构
对于任何代码,数据结构是基础,搞清楚了数据结构才能搞清楚代码运行的逻辑。借用钟大师的一段话:
数据结构是什么?数据结构就是舞台上的角色,而函数方法就是这些角色之间演出的一幕幕戏。对象是有生命的,从创建到数据流转,从产生到消亡。而作为开发者来说,首先是搞懂这些人物设定,是关公还是秦琼,是红脸还是黑脸?看懂了人,就看懂了戏。 ——摘自钟大师的博客
因此在分析go-restful这个库的功能和使用方法之前,我们先来了解一下这个库的几个关键数据结构。
1.1 Container
Container
对应的是一个server端中所有API的集合,一般一个server中包含一个Container
即可。
1 | // Container holds a collection of WebServices and a http.ServeMux to dispatch http requests. |
这其中有2个元素特别关键:
webServices
,后文会继续说明ServeMux
,这个其实就是go的http
库中的ServeMux
,也就是路由规则器,这个是go中起server
的关键数据结构,其中包含了路由与对应处理函数的map,这个是注册API的关键
1 | // 源码位于go的原生库中:src/net/http/server.go |
通过ServeMux
数据结构可以很清楚地推断出server端再收到请求之后做的事情:先根据请求的URL再map中找到对应注册的Handler
,再调用Handler
实现的ServeHTTP(ResponseWriter, *Request)
函数来处理请求。
1.2 WebService
WebService
是
1 | // WebService holds a collection of Route values that bind a Http Method + URL Path to a function. |
1.3 Route
Route
中绑定了某一个资源的方法和路径所对应的handler函数,是最小的API操作单位。
1 | // Route binds a HTTP Method,Path,Consumes combination to a RouteFunction. |