Golang标准库http.ServeMux及如何获取所有已注册路径

Golang标准库http.ServeMux及如何获取所有已注册路径 有人能帮忙获取所有已注册的路径吗?例如:

mux.Handler("/some/path", callSomeFunc())

有什么建议吗?

4 回复

我是认真的,不过本质上它们是相同的概念。只是你的描述更偏向基于OOP类的表述,而我的用的是Go语言的术语。

更多关于Golang标准库http.ServeMux及如何获取所有已注册路径的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


CurtGreen:

我不确定你这样做的使用场景是什么

你好!感谢回复。 “我不确定你这样做的使用场景是什么” - 只是想要渲染一个"系统页面",在那里我可以看到应用程序的所有可用路由。

“ServeMux 将你的处理程序注册到未导出的字段” - 你是指私有属性吗?

ServeMux 将您的处理器注册到未导出的字段中,因此您无法直接检索它们。也没有针对此行为的方法函数。我不确定您对此的使用场景是什么,但您可以临时凑合使用一些方法来测试 ServeMux.Handler() 函数的一系列可能路径。除非您知道自己在寻找什么,否则这将完全不可靠,因此路径发现并不是真正的解决方案。

我很好奇您是否正在尝试实现服务架构,并试图从服务器获取服务发现行为。如果是这样,这是错误的路径。

在Go语言的标准库net/http中,http.ServeMux类型内部维护了一个已注册路径的映射,但这些路径并未直接公开为公共API。不过,可以通过反射来访问其内部结构以获取所有已注册路径。以下是一个示例代码,展示如何实现这一点:

package main

import (
    "fmt"
    "net/http"
    "reflect"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/some/path", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "处理路径 /some/path")
    })
    mux.HandleFunc("/another/path", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "处理路径 /another/path")
    })

    // 使用反射访问 ServeMux 的私有字段 m
    v := reflect.ValueOf(mux).Elem()
    mField := v.FieldByName("m")
    if mField.IsValid() && mField.Kind() == reflect.Map {
        keys := mField.MapKeys()
        fmt.Println("已注册的路径:")
        for _, key := range keys {
            fmt.Println(key.String())
        }
    } else {
        fmt.Println("无法访问 ServeMux 的路径映射")
    }
}

运行此代码将输出:

已注册的路径:
/some/path
/another/path

注意:这种方法依赖于http.ServeMux的内部结构(具体是字段m),该结构在Go标准库中可能随版本更新而改变。因此,在生产环境中使用反射时需谨慎,并确保测试兼容性。如果只是用于调试或开发目的,这是一个有效的解决方案。

回到顶部