登录
首页 >  Golang >  Go问答

改变 Golang HTTP Mux 的处理函数

来源:stackoverflow

时间:2024-03-01 10:45:25 138浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《改变 Golang HTTP Mux 的处理函数》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我对 Go 还很陌生,还没有找到任何相关信息,也许目前还不可能。

我正在尝试删除或替换 mux 路由(使用 http.NewServeMux 或 gorilla 的 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)
}

是的,可以。

一种方法是使用以下方法实现 http.handle 接口的结构 servehttp。 然后让该结构包含另一个像大猩猩一样的复用器 最后有一个原子开关来启用/禁用子路由

这是我的意思的一个工作示例:

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
    "sync/atomic"
)

var recording int32

func isRecording() bool {
    return atomic.LoadInt32(&recording) != 0
}

func setRecording(shouldRecord bool) {
    if shouldRecord {
        atomic.StoreInt32(&recording, 1)
    } else {
        atomic.StoreInt32(&recording, 0)
    }
}

type SwitchHandler struct {
    mux http.Handler
}

func (s *SwitchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if isRecording() {
        fmt.Printf("Switch Handler is Recording\n")
        s.mux.ServeHTTP(w, r)
        return
    }

    fmt.Printf("Switch Handler is NOT Recording\n")
    w.WriteHeader(http.StatusNotFound)
    fmt.Fprintf(w, "NOT Recording\n")

}

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/success/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Recording\n")
    })

    handler := &SwitchHandler{mux: router}

    setRecording(false)

    http.Handle("/", handler)

    http.ListenAndServe(":8080", nil)
}

今天关于《改变 Golang HTTP Mux 的处理函数》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>