ऐसा लगता है कि आप पहले ही एक उत्तर स्वीकार कर चुके हैं, लेकिन मैं वैकल्पिक समाधान का प्रस्ताव देना चाहता था।
मैं कस्टम मक्सर जोड़ने की आवश्यकता पर सवाल उठाता हूं। इस उदाहरण में मैं गोरिल्ला मक्सर का उपयोग कर रहा हूं, हालांकि यह केवल इसलिए है क्योंकि मैं इसके पैटर्न मिलान से परिचित हूं। सिद्धांत रूप में आप डिफ़ॉल्ट मक्सर को बदलने की आवश्यकता के बिना आने वाले यूआरएल से पैटर्न से मेल खा सकते हैं।
मेरे कोड एक नक्शे में हैंडलर कार्यों को बनाए रखता है (स्ट्रिंग: हैंडलर नाम => समारोह शाब्दिक) ... यह डिफ़ॉल्ट muxers HandleFunc विधि का उपयोग के लिए उपयुक्त है।
नमूना इनपुट/आउटपुट:
प्राप्त/रजिस्टर/123
प्राप्त/123
hello from123.
प्राप्त/नष्ट/123
प्राप्त/123
[nothing]
package main
import (
"code.google.com/p/gorilla/mux"
"flag"
"log"
"net/http"
)
// Wraps server muxer, dynamic map of handlers, and listen port.
type Server struct {
Dispatcher *mux.Router
Urls map[string]func(w http.ResponseWriter, r *http.Request)
Port string
}
// May the signal never stop.
func main() {
//Initialize Server
server := &Server{Port: "3000", Dispatcher: mux.NewRouter(), Urls: make(map[string]func(w http.ResponseWriter, r *http.Request))}
var port = flag.String("port", "3000", "Default: 3000; Set the port for the web-server to accept incoming requests")
flag.Parse()
server.Port = *port
log.Printf("Starting server on port: %s \n", server.Port)
server.InitDispatch()
log.Printf("Initializing request routes...\n")
server.Start() //Launch server; blocks goroutine.
}
func (s *Server) Start() {
http.ListenAndServe(":"+s.Port, s.Dispatcher)
}
// Initialize Dispatcher's routes.
func (s *Server) InitDispatch() {
d := s.Dispatcher
// Add handler to server's map.
d.HandleFunc("/register/{name}", func(w http.ResponseWriter, r *http.Request) {
//somewhere somehow you create the handler to be used; i'll just make an echohandler
vars := mux.Vars(r)
name := vars["name"]
s.AddFunction(w, r, name)
}).Methods("GET")
d.HandleFunc("/destroy/{name}", func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
name := vars["name"]
s.Destroy(name)
}).Methods("GET")
d.HandleFunc("/{name}", func(w http.ResponseWriter, r *http.Request) {
//Lookup handler in map and call it, proxying this writer and request
vars := mux.Vars(r)
name := vars["name"]
s.ProxyCall(w, r, name)
}).Methods("GET")
}
func (s *Server) Destroy(fName string) {
s.Urls[fName] = nil //remove handler
}
func (s *Server) ProxyCall(w http.ResponseWriter, r *http.Request, fName string) {
if s.Urls[fName] != nil {
s.Urls[fName](w, r) //proxy the call
}
}
func (s *Server) AddFunction(w http.ResponseWriter, r *http.Request, fName string) {
f := func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello from" + fName))
}
s.Urls[fName] = f // Add the handler to our map
}
चिंता यह है कि हैंडलर रजिस्ट्री समय के साथ बढ़ रही है रखने के लिए और तेजी से महंगा हैंडलर लुकअप की वजह से अनुरोध बदलाव में एक मंदी का कारण बन जाएगा। –