2013-03-06 11 views
49

Próbuję dowiedzieć się, że najlepszym sposobem, aby obsługiwać żądania do / i tylko / w Go i obsługi różnych metod w różnych sposobów. Oto najlepsze, co wymyśliłem:Jak mogę obsłużyć żądania http różnych metod do/w Go?

package main 

import (
    "fmt" 
    "html" 
    "log" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     if r.URL.Path != "/" { 
      http.NotFound(w, r) 
      return 
     } 

     if r.Method == "GET" { 
      fmt.Fprintf(w, "GET, %q", html.EscapeString(r.URL.Path)) 
     } else if r.Method == "POST" { 
      fmt.Fprintf(w, "POST, %q", html.EscapeString(r.URL.Path)) 
     } else { 
      http.Error(w, "Invalid request method.", 405) 
     } 
    }) 

    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

Czy to idiomatyczne Go? Czy to najlepsze, co mogę zrobić ze standardową biblioteką http? Wolałbym zrobić coś takiego jak http.HandleGet("/", handler), jak w wyrażeniu lub Sinatra. Czy istnieją dobre ramy do pisania prostych usług REST? web.go wygląda atrakcyjnie, ale wydaje się być w stagnacji.

Dziękuję za radę.

+2

może być zainteresowany w http://www.gorillatoolkit.org/pkg/mux jeśli tylko szukasz abstrakcji routingu. – dskinner

+1

+1. mux lub http://www.gorillatoolkit.org/pkg/pat są znakomite do tego, aby je streścić. – minikomi

Odpowiedz

45

Aby upewnić się, że tylko służyć korzeń: Robisz słusznie. W niektórych przypadkach będziesz chciał wywołać metodę ServeHttp obiektu http.FileServer zamiast wywoływać NotFound; zależy to od tego, czy masz różne pliki, które również chcesz obsłużyć.

do obsługi różnych metod inaczej: Wielu moich obsługą HTTP zawierać nic prócz instrukcji switch tak:

switch r.Method { 
case "GET": 
    // Serve the resource. 
case "POST": 
    // Create a new record. 
case "PUT": 
    // Update an existing record. 
case "DELETE": 
    // Remove the record. 
default: 
    // Give an error message. 
} 

Oczywiście, może się okazać, że pakiet z innymi firmami, jak goryl działa lepiej dla Ciebie.

20

Eh, faktycznie chodziłam do łóżka, a tym samym do szybkiego komentarza na temat patrzenia na http://www.gorillatoolkit.org/pkg/mux, który jest naprawdę miły i robi to, co chcesz, po prostu daj docs przegląd. Na przykład

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", HomeHandler) 
    r.HandleFunc("/products", ProductsHandler) 
    r.HandleFunc("/articles", ArticlesHandler) 
    http.Handle("/", r) 
} 

i

r.HandleFunc("/products", ProductsHandler). 
    Host("www.domain.com"). 
    Methods("GET"). 
    Schemes("http") 

i wiele innych możliwości i sposobów, aby wykonać powyższe czynności.

Ale poczułem potrzebę zajęcia drugą część pytania: „Czy to najlepsze, co mogę zrobić”. Jeśli lib std jest trochę zbyt gładkie, wielki zasób, aby sprawdzić to tutaj: https://github.com/golang/go/wiki/Projects#web-libraries (związany konkretnie do bibliotek internetowych).

Powiązane problemy