I want to bind 2 urls to 1 function, like below.
router.HandleFunc("/_Users", controller.AddResource)
router.HandleFunc("/Resources/{resourceName}", controller.AddResource)
the "controller.AddResource" is a global function. the code like below:
function AddResource(req *http.Request, w http.ResponseWriter){
vars := mux.Vars(req)
resourceName := vars["resourceName"]
data = request.Body
AddDataToResource(resourceName, data)
}
so how can I set the vars(resourceName='_User') in the first router?
Create a handler wrapper that sets the mux var:
type setVarWrapper struct {
fn func(http.ResponseWriter, *http.Request)
name string
value string
}
func (h *setVarWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
mux.Vars(req)[h.name] = h.value
h.fn(w, r)
}
Wrap the user controller:
router.Handle("/_Users, &setVarWrapper{fn:controller.AddResource, name:"resourceName", value:"_User"})
A simpler option is to write an AddUser function that calls through to the generic controller:
function addUser(req *http.Request, w http.ResponseWriter){
mux.Vars(req)["resourceName"] = "_User"
controller.AddResource(w, req)
}
router.HandleFunc("/_Users", addUser)
Perhaps even simpler is to check for "" in the handler:
function AddResource(req *http.Request, w http.ResponseWriter){
vars := mux.Vars(req)
resourceName := vars["resourceName"]
if resourceName == "" {
resourceName = "_User"
}
data = request.Body
AddDataToResource(resourceName, data)
}