2013-05-09 11 views
7

Załóżmy, że mam następujące żądania routingu funkcji init.Appengine with Go: Czy istnieje prehook http.Handle lub coś podobnego?

func init() { 
    http.HandleFunc("/user", handler1) 
    http.HandleFunc("/user/profile", handler2) 
    http.HandleFunc("/user/post", handler3) 
    .... 
    .... 
} 

Wszystko to wymaga, że ​​mam profil użytkownika.

wiem mogę

func handler1(w http.ResponseWriter, r *http.Request) { 
    getUserdata() 
    //Actual handler code 
    ... 
    ... 
} 

Ale czy istnieje sposób mogę uzyskać dane z pominięciem wywołanie funkcji w każdym obsługi? Czy to jest coś, co Go chciałby, żebyś zrobił?

Odpowiedz

9

Masz dwie opcje.

  1. Można inplement interfejs
  2. owinąć http.Handler wszystkie swoje http.HandlerFunc z obwolutą HandleFunc.

Ponieważ wygląda na to, chcesz coś prostego będę zilustrować owijki

func Prehook(f http.HandlerFunc) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
    getUserData() 
    f(w, r) 
    } 
} 

func init() { 
    // use getUserData() call before your handler 
    http.HandleFunc("/user", Prehook(handler1)) 
    // Don't use getUserData call before your handler 
    http.HandleFunc("/user/profile", handler2) 
} 
+0

który wygląda dokładnie jak to, co muszę. Spojrzałem nawet na owijanie funkcji, ale byłem już sfrustrowany i nie mogłem tego naprawić. Dziękuję bardzo! –

+0

Jak by to wyglądało, gdyby wprowadzono opcję 1? – Ralf

Powiązane problemy