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

5djindoudou · · 747 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:5djindoudou

查看原文:golang使用mux实现http自定义路由

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

747 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传