最近在做坐席管理的服务,其中需要对上层业务提供外部的REST接口,去对坐席、坐席组、租户域进行增删改查操作。
采用了gorilla开发的mux实现自定义路由。
package地址如下:github.com/gorilla/mux
Golang中http的设计非常轻量,且具有很高的扩展性,上手非常简单。参考gorilla给出的wiki就可以轻易设计出自定义的路由功能。
这对于像我这样的c语言开发者而言,是非常友善的。
下面直接上代码,讲述一下。
我设计了以下三种URL分别定位三种资源(域、组、坐席):
/v1/voip/hlr/mange/domain
/v1/voip/hlr/mange/group
/v1/voip/hlr/mange/user
于是,定义了一个二维map的全局变量,第一维map中可以是URL中的资源目录,第二维map中存放该资源支持的方法(POST/GET/PUT/DELETE等):
type hlrHTTPHandlers map[string]map[string]interface{}
二维map的全局变量初始化时,稍微繁琐一点。就是第一维map中的每个value需要 调用make生成map结构。例如:
handlers := make(hlrHTTPHandlers)
//域路由
handlers["domain"] = make(map[string]interface{})
用mux实现路由,URL路径可以具有变量。 它们使用{name}或{name:pattern}格式定义。 如果未定义正则表达式模式,则匹配的变量将是下一个斜杠之前的任何内容。 例如:
//路由绑定
r := mux.NewRouter()
r.HandleFunc("/v1/voip/hlr/mange/{category}", hlrHTTPFunc)
r.HandleFunc("/v1/voip/hlr/mange/{category}/{id:[0-9]+}", hlrHTTPSubFunc)
这些name用于创建路由变量的映射,可以调用mux.Vars()来检索它们。
绑定的一条路由:
func hlrHTTPFunc(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Category: %v\n", vars["category"])
}
绑定的另外一条路由:
funchlrHTTPSubFunc(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Category: %v id: %v\n", vars["category"], vars["id"])
}
golang相比c/c++,还是容易开发的。相同的一个项目,拿c语言实现以后再拿go重构一遍,单单从代码量上来看,代码量减少了七成之多。
学习之路漫漫,坑要一个个踩。