2015-04-30 79 views
0

最佳方式使用大猩猩複用,我現在有很多網址的格式爲:Golang大猩猩MUX,以配合對兩名網址簽名

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

使得代碼如下所示:

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

我想也是對陣:

subdomain.domain.com/{name}/pagename

我知道我可以這樣做

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

匹配的子域。是否有可能只有一個HandleFunc()匹配這兩種類型的URL,還是我需要兩個HandleFunc(),一個用於第一種情況,一個用於subdomain.domain.com情況?

+2

將它們作爲2條路線處理有什麼問題?他們都可以指向相同的處理函數。你必須以某種方式聲明路徑和主機,所以沒有辦法縮短它。 – JimB

+0

我有大約100個處理程序,並希望避免代碼臃腫/維護問題與每個重複路線。 –

+0

@MarkFletcher查看我的解決方案 – metakeule

回答

0

像這樣的調度器,你只需要爲每個路由器/處理程序添加一行。

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) 
} 
+0

對不起,這可能是一個愚蠢的問題(但我學習更多這種方式) - 請你能解釋一下這個Dispatcher方法如何減少代碼,因爲上面的代碼有來自OP的r.Handle和r.Host調用。這似乎是一個不同的方式來實現相同的,我錯過了什麼? – miltonb

+0

它只是使添加進一步處理程序的域名和名稱的組合很容易。我想這是最終的目標。假如你有20個域名/名稱處理程序,只需寫入處理程序併爲每個處理程序添加一個新條目到Dispatcher。 – metakeule

+0

謝謝 - 當然它非常簡單。 :) – miltonb