dongtang3155 2015-04-30 16:58
浏览 140
已采纳

Golang Gorilla Mux,匹配两个URL签名的最佳方法

Using gorilla mux, I currently have many URLs that are of the form:

domain.com/org/{subdomain}/{name}/pagename

such that the code looks like:

rtr.HandleFunc("/org/{subdomain}/{name}/promote", promoteView)

I'd like to also match against:

subdomain.domain.com/{name}/pagename

I know I can do something like

rtr.Host("{subdomain:[a-z]+}.domain.com").HandleFunc("/{name}/promote", promoteView)

to match on the subdomain. Is it possible to only have one HandleFunc() that will match both types of URLs, or do I need to have two HandleFunc()s, one for the first case and one for the subdomain.domain.com case?

  • 写回答

1条回答 默认 最新

  • douzhimao8656 2015-04-30 20:35
    关注

    With a dispatcher like this you only have to add one line per router/handler.

    package main
    
    import (
        "fmt"
        "github.com/gorilla/mux"
        "net/http"
    )
    
    type key struct {
        subdomain, name string
    }
    
    type dispatcher map[key]http.Handler
    
    func (d dispatcher) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        handler, ok := d[key{vars["subdomain"], vars["name"]}]
    
        if ok {
            handler.ServeHTTP(w, r)
            return
        }
        http.NotFound(w, r)
    }
    
    func handleA(rw http.ResponseWriter, req *http.Request) {
        fmt.Fprintln(rw, "handleA serving")
    }
    
    func handleB(rw http.ResponseWriter, req *http.Request) {
        fmt.Fprintln(rw, "handleB serving")
    }
    
    var Dispatcher = dispatcher{
        key{"subA", "nameA"}: http.HandlerFunc(handleA),
        key{"subB", "nameB"}: http.HandlerFunc(handleB),
        // add your new routes here
    }
    
    func main() {
        r := mux.NewRouter()
        r.Handle("/org/{subdomain}/{name}/promote", Dispatcher)
        r.Host("{subdomain:[a-z]+}.domain.com").Path("/{name}/promote").Handler(Dispatcher)
    
        http.ListenAndServe(":8080", r)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 three.js添加后处理以后模型锯齿化严重