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

2023-05-16

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang使用mux实现http自定义路由 的相关文章

  • Zoopla 沙箱出现 cURL http 标头错误

    我正在为房地产经纪人开发代码 以通过他们的数据源将房产上传到 Zoopla 我在将所需的配置文件添加到所需的 http 标头时遇到问题 文档中唯一的示例是来自 Linux 的测试 echo branch reference test cur
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • http和https在编程中有什么区别[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只知道 s 代表 安全 用户永远不
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 为 REST API 编写单元测试的最佳方法是什么?

    在为 API 包装器编写单元测试时 我应该对 REST API 端点进行真正的调用 还是应该使用 mocl 响应来模拟成功和错误的调用 单元测试意味着只测试你的unit API 包装器 仅此而已 因此 不幸的是 您应该模拟整个 API 另一
  • Node.js:在检索 http 请求正文之前断开 http 请求连接

    我正在用 Node js 编写一个 http 服务器 我有一个客户端通过 HTTP POST 多部分 数据 将大文件上传到该服务器 我想接受唯一使用有效文件名上传文件的连接 我有一些条件 在服务器检索数据之前应断开无效文件名连接 我不知道如
  • 如何找出数据包的HTTP头长度?

    我知道如何手动执行此操作 通过查看十六进制转储 我怎样才能自动获得相同的信息 我必须使用 API 吗 我有wireshark 和Microsoft 网络监视器 这可以通过简单地实现Lua解析器 http wiki wireshark org
  • 使用:text/plain; 有什么缺点吗?字符集=“UTF-8”

    我的网络服务器提供的内容在 95 的情况下只是简单的 ascii 但在极少数情况下 内容包含一些德语非 ASCII 字符 现在我可以设置content type通过检测内容是否包含任何非 ASCII 字符来响应标头 或者我可以始终设置响应标
  • 使用 POST 请求向 Jira API 发送 JSON 时出现 System.Net.WebException

    好吧 伙计们 我已经为这个问题苦苦挣扎了一天左右 但没有明确的解决方案 我将从例外开始 The remote server returned an error NotFound at System Net Browser AsyncHelp
  • 在防火墙后面使用 GitHub,无需 SSH 访问

    我真的很想使用 GitHub 但我的公司一切都被锁定了 现在 我只能通过HTTP协议使用Tortoise SVN 我可以以同样的方式使用 GitHub 吗 如果是这样 怎么办 我认为你一直能够克隆github https github co
  • HTTPbis - bis 是什么意思?

    我经常看到 bis 附加到协议版本 例如 v 34bis 或 httpbis bis 是什么意思或代表什么 我认识的一位电信工程师认为它可能起源于法国 正如其他人已经说过的 bis 来自 两次 或 重复 http oxforddiction
  • 为什么 Firefox 会忽略缓存标头并在刷新时重新验证?

    我有一些不可变的图像资源 可以永久缓存 Chrome 似乎尊重我的响应标头 并且不会重新验证资源 以下是 Chrome 中其中一项资源的示例 正如你所看到的 我包括cache control public max age expires e
  • PUT/DELETE 与 REST 是自动幂等的吗?

    我正在学习 REST 和 PUT DELETE 我读到这两者 以及 GET 都是幂等的 这意味着多个请求使服务器进入相同的状态 重复的 PUT DELETE 请求是否会离开 Web 浏览器 当使用XMLHttpRequest 换句话说 服务
  • Google Closure 编译器和 multipart/form-data 不起作用

    我正在向 google 闭包编译器 API 服务发出请求 content file get contents file js url http closure compiler appspot com compile post true p
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 在 grails 中编写代理

    我正在使用 Gralis 1 3 7 我正在编写一个控制器 需要从另一台服务器获取 PDF 文件并将其返回给客户端 我想以某种相当有效的方式来做到这一点 例如 class DocController def view URL source
  • 当响应有正文时,内容长度或传输编码是必需的吗

    如果响应有正文 可以有正文 即状态代码不是 204 或 304 则响应标头中是否应始终具有内容长度或传输编码 在规范中 它不是很清楚 在我的场景中 我的主体没有内容长度或传输编码标头 因此卷曲继续等待no chunk no close no
  • HTTP 接受“级别”?

    我一直在阅读HTTP 1 1 标头 http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 1在第 14 1 节 接受 的一些示例标头中 他们使用accept extension

随机推荐