首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go:如何组合两个(或更多) http.ServeMux?

Go:如何组合两个(或更多) http.ServeMux?
EN

Stack Overflow用户
提问于 2014-05-16 13:57:32
回答 2查看 4.9K关注 0票数 5

假设您有两个http.ServeMux实例,并且您希望在相同的端口号上为它们提供服务,如下所示:

代码语言:javascript
复制
    muxA, muxB http.ServeMux
    //initialise muxA
    //initialise muxB
    combinedMux := combineMux([muxA, muxB])
    http.ListenAndServe(":8080", combinedMux)

如上所述,如何编写combinedMux函数?

..。或者,有没有替代的方法来完成同样的事情?

EN

回答 2

Stack Overflow用户

发布于 2017-04-13 05:34:43

因为http.ServeMux也是http.Handler,所以您可以很容易地将一个多路复用器嵌套在另一个多路复用器中,即使是在相同的端口和相同的主机名上也是如此。这里有一个这样做的例子:

代码语言:javascript
复制
rootMux := http.NewServeMux()
subMux := http.NewServeMux()

// This will end up handling /top_path/sub_path
subMux.HandleFunc("/sub_path", myHandleFunc)

// Use the StripPrefix here to make sure the URL has been mapped
// to a path the subMux can read
rootMux.Handle("/top_path/", http.StripPrefix("/top_path", subMux))

http.ListenAndServe(":8000", rootMux)

请注意,如果没有该http.StripPrefix()调用,您将需要在较低的mux中处理整个路径。

票数 14
EN

Stack Overflow用户

发布于 2014-05-16 22:59:00

SeverMux类型本身就是一个http.Handler,因此您可以很容易地嵌套它们。例如:

代码语言:javascript
复制
mux := NewServeMux()
mux.AddHandler("server1.com:8080/", muxA)
mux.AddHandler("server2.com:8080/", muxB)

我不太确定你所说的“组合”它们到底是什么意思。如果您想在404中先尝试一个处理程序,然后再尝试另一个处理程序,您可以这样做(未测试):

代码语言:javascript
复制
mux := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    rec := httptest.NewRecorder()
    rec.Body = &bytes.Buffer{}
    muxA.ServeHTTP(rec, r)
    if rec.Code == 404 {
        muxB.ServeHTTP(w, r)
        return
    }
    for key, val := range rec.HeaderMap {
        w.Header().Set(key, val)
    }
    w.WriteHeader(rec.Code)
    rec.Body.WriteTo(w)
})

这显然有一些缺点,比如将整个响应存储在内存中。或者,如果您不介意调用两次处理程序,也可以设置rec.Body = nil,只选中rec.Code,如果成功,则再次调用muxA.ServeHTTP(w, r)。但重构应用程序可能更好,这样第一种方法(嵌套ServerMux)就足够了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23693520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档