golang使用mux实现http自定义路由

    技术2024-11-06  8

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

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

    Processed: 0.014, SQL: 9