Blog
Gorilla Mux - Ein Router und Dispatcher für Go

In meinem letzten Blog über die Programmiersprache Go haben wir gesehen, wie einfach es ist, mit ein paar Zeilen Go einen HTTP-Server zu erstellen. Dieses Mal werden wir uns Gorilla Mux (Mux) ansehen, einen vollwertigen Router und Dispatcher.
Einfacher HTTP-Server
Das Paket net/http bietet HTTP-Client- und -Server-Implementierungen. Wir können einen einfachen Server erstellen und mit HandlerFunc eine Funktion registrieren, die HTTP-Anfragen bearbeitet.
package main
import (
"io"
"net/http"
)
func IndexHandler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, world!n")
}
func main() {
http.HandleFunc("/", IndexHandler)
http.ListenAndServe(":8080", nil)
}
Mux
Mux bietet die gleiche Router/Dispatcher-Funktion wie 'http.Handlefunc', indem es eingehende Anfragen mit einer Liste registrierter Routen abgleicht und die Handler-Funktion aufruft.
package main
import (
"github.com/gorilla/mux"
"io"
"net/http"
)
func IndexHandler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, Mux!n")
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", IndexHandler)
http.Handle("/", r)
http.ListenAndServe(":8080", nil)
}
Mux-Anpassung
Mux verfügt über eine umfangreichere Matcher-Engine als Go standardmäßig bietet. Mux kann auch Anfragen auf der Grundlage von URL-Host, Pfad, Pfadpräfix, Schemata, Header- und Abfragewerten, HTTP-Methoden abgleichen oder Sie können Ihren eigenen benutzerdefinierten Matcher schreiben. Die Pfade können Variablen und Regex-Ausdrücke für die Übereinstimmung enthalten.
package main
import (
"encoding/json"
"github.com/gorilla/mux"
"io"
"log"
"net/http"
"strconv"
)
type Cat struct {
ID int json:"id"
Name string json:"name"
Age int json:"age"
}
var cats = []Cat {
Cat { ID: 1, Name:"Elsa", Age: 16 },
Cat { ID: 2, Name:"Tijger", Age: 12 },
}
func IndexHandler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, Mux!n")
}
func CatsHandler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(cats)
}
func CatHandler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(req)
id, _ := strconv.Atoi(params["id"])
for _, cat := range cats {
if cat.ID == id {
json.NewEncoder(w).Encode(cat)
return
}
}
w.WriteHeader(http.StatusNotFound)
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", IndexHandler).Methods("GET")
r.HandleFunc("/cats", CatsHandler).Methods("GET")
r.HandleFunc("/cats/{id:[0-9]+}", CatHandler).Methods("GET")
http.Handle("/", r)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Fazit
Die Go-Standardbibliothek bietet HTTP-Server-Implementierungen mit grundlegenden Router-/Dispatcher-Funktionen. Meistens benötigen Sie eine umfangreichere Abgleichsfunktion und Gorilla Mux bietet eine solche. Es kann Anfragen auf der Grundlage von URL-Host, Pfad, Pfadpräfix, Schemata, Header- und Abfragewerten, HTTP-Methoden und sogar auf Regex abgleichen. Das nächste Mal werden wir Mux in einem Google App Engine Beispiel verwenden.
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact



