最近在做坐席管理的服务,其中需要对上层业务提供外部的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重构一遍,单单从代码量上来看,代码量减少了七成之多。

学习之路漫漫,坑要一个个踩。