2016-12-06 14 views
0

Есть ли простой способ установить функцию обратного вызова, которая вызывается для каждого HTTP-запроса, сделанного на веб-сервере gorilla/mux HTTP? Кажется, у них нет понятия об установке функции обратного вызова в своих документах.Настройка обратного вызова с пакетом Golang Gorilla

Я хотел проверить один из заголовков для получения некоторой информации о каждом вызове на моем сервере.

+0

Вы также можете создать свою собственную функцию промежуточного программного обеспечения и приковать их вместе, используя что-то вроде Алисе. – squiguy

ответ

2

gorilla/mux сам по себе является просто маршрутизатором и диспетчером, который, хотя технически может делать то, что вы просите, на самом деле не предназначен для этого.

«Идиоматический» подход заключается в том, чтобы обернуть обработчик промежуточным программным обеспечением, которое украсит ваш обработчик любыми дополнительными функциями, например, чтобы проверять заголовки для получения некоторой информации о каждом вызове.

Расширение на горилл/мультиплексоров full example, вы могли бы сделать что-то вроде:

package main 

import (
     "log" 
     "net/http" 

     "github.com/gorilla/mux" 
) 

func HeaderCheckWrapper(requiredHeader string, original func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { 
     return func(w http.ResponseWriter, r *http.Request) { 
       if foo, ok := r.Header[requiredHeader]; ok { 
         // do whatever with the header value, and then call the original: 
         log.Printf("Found header %q, with value %q", requiredHeader, foo) 
         original(w, r) 
         return 
       } 
       // otherwise reject the request 
       w.WriteHeader(http.StatusPreconditionFailed) 
       w.Write([]byte("missing expected header " + requiredHeader)) 
     } 
} 

func YourHandler(w http.ResponseWriter, r *http.Request) { 
     w.Write([]byte("Gorilla!\n")) 
} 

func main() { 
     r := mux.NewRouter() 
     // Routes consist of a path and a handler function. 
     r.HandleFunc("/", HeaderCheckWrapper("X-Foo-Header", YourHandler)) 

     // Bind to a port and pass our router in 
     log.Fatal(http.ListenAndServe(":8000", r)) 
} 
2

Если вы хотите, чтобы иметь обработчик, который может принимать все запросы на маршрутизаторе вы можете использовать alice приковать обработчики вместе.

Это простой способ действовать во всех входящих запросах.

Вот пример:

package main 

import (
    "net/http" 

    "github.com/gorilla/mux" 
    "github.com/justinas/alice" 
) 

func MyMiddleware(next http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     if len(r.URL.Path) > 1 { 
      http.Error(w, "please only call index because this is a lame example", http.StatusNotFound) 
      return 
     } 
     next.ServeHTTP(w, r) 
    }) 
} 

func Handler(w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("Hello")) 
} 

func main() { 
    r := mux.NewRouter() 

    r.HandleFunc("/", Handler) 
    r.HandleFunc("/fail", Handler) 

    chain := alice.New(MyMiddleware).Then(r) 

    http.ListenAndServe(":8080", chain) 
} 
+0

Хорошее улучшение @squiguy –

+1

Спасибо, я подумал, что должен поделиться примером. – squiguy

 Смежные вопросы

  • Нет связанных вопросов^_^