当前位置: 首页 > 面试题库 >

Golang HTTP Mux更改处理程序功能

华展鹏
2023-03-14
问题内容

我对Go来说还很陌生,还无法找到任何有关此的信息,也许目前尚无法解决。

我正在尝试删除或替换多路复用器路由(使用http.NewServeMux或大猩猩的mux.Router)。我的最终目标是能够启用/禁用一条路由或一组路由,而不必重新启动程序。

我可能可以在处理程序到处理程序的基础上完成此操作,并且如果该功能被“禁用”,则只返回404,但是我宁愿找到一种更通用的方法来执行此操作,因为我想为应用程序中的每个路由实现该功能

还是只跟踪禁用的URL模式并使用一些中间件来防止处理程序执行,我会更好吗?

如果有人至少可以向我指出正确的方向,那么我绝对会发布一个解决方案的代码示例(假设有一个解决方案)。谢谢!


问题答案:

没有内置的方式,但是实施play很容易。

type HasHandleFunc interface { //this is just so it would work for gorilla and http.ServerMux
    HandleFunc(pattern string, handler func(w http.ResponseWriter, req *http.Request))
}
type Handler struct {
    http.HandlerFunc
    Enabled bool
}
type Handlers map[string]*Handler

func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path
    if handler, ok := h[path]; ok && handler.Enabled {
        handler.ServeHTTP(w, r)
    } else {
        http.Error(w, "Not Found", http.StatusNotFound)
    }
}

func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) {
    h[pattern] = &Handler{handler, true}
    mux.HandleFunc(pattern, h.ServeHTTP)
}

func main() {
    mux := http.NewServeMux()
    handlers := Handlers{}
    handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("this will show once"))
        handlers["/"].Enabled = false
    })
    http.Handle("/", mux)
    http.ListenAndServe(":9020", nil)
}


 类似资料:
  • 有没有一种方法可以添加一个登录成功处理程序使用spall-oaut2? 我尝试使用基本身份验证过滤器,但它只过滤客户端凭据,而不是用户凭据。 还是需要创建自定义用户身份验证管理器? 蒂亚

  • 问题内容: 我正在创建一个RESTful Web服务(在Golang中),该服务从数据库中提取一组行并将其返回给客户端(智能手机应用程序或Web应用程序)。该服务需要能够提供分页。唯一的问题是,此数据在定期更改的“计算”列上排序(例如,网站上某内容的“竖起大拇指”或“竖起大拇指”的数量),因此 行可以在在客户的要求之间 。 我看了一些PostgreSQL功能,可以潜在地用来帮助我解决这个问题,但是

  • 我有一个在视图上执行动画的功能。我想为此函数实现一个完成处理程序,该处理程序将在动画完成后调用。 在ViewController中... 在HudView类中... 我尝试了很多方法,但找不到正确的语法: 传递非转义参数“myCompletionHandler”到函数,期望一个@转义闭包 无法将“Void”类型的值转换为预期的参数类型“((Bool) - 闭包:使用非转义参数“myCompleti

  • 问题内容: 我有一个Java类,该类存储在HttpSession对象中,该对象在集群环境中的服务器之间进行了序列化和传输。为了便于说明,我们将此类称为“人员”。 在改进代码的过程中,该类从“ com.acme.Person”移动到“ com.acme.entity.Person”。在内部,该类保持完全相同(相同的字段,相同的方法,相同的所有内容)。 问题是我们有两组服务器同时运行旧代码和新代码。具

  • 为了使图片更完整(也更复杂),假设我还有以下处理程序: 此处理程序允许返回字符串由和序列化,具体取决于客户端传递的。返回类型和值应如下:

  • 问题内容: 内容: 我想使用jenkins定期仅处理SVN中已更改的文件,并将处理的输出提交回SVN。 原因: 我们正在将二进制文件提交到SVN中(我们正在使用Oracle Forms,并且正在提交fmb- Files)。我创建了一个脚本,将fmb导出到xml(使用Oracle的原始Fmb2XML工具),然后我将XML转换为我们也想提交的纯源。这使我们可以进行摸索,查看更改等。 问题: 目前,我只