2013-03-06 12 views
49

Sto cercando di capire il modo migliore per gestire le richieste a / e solo a / in Go e gestire diversi metodi in modi diversi. Qui è la migliore che è venuta in mente:Come posso gestire le richieste http di metodi diversi su/in 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)) 
} 

È questo idiomatica Go? È questo il meglio che posso fare con lo standard http lib? Preferirei fare qualcosa come http.HandleGet("/", handler) come espresso o Sinatra. C'è una buona struttura per scrivere semplici servizi REST? web.go sembra attraente ma sembra stagnante.

Grazie per il vostro consiglio.

+2

potresti essere interessato a http://www.gorillatoolkit.org/pkg/mux se stai solo cercando un'astrazione di routing. – dskinner

+1

+1. mux o http://www.gorillatoolkit.org/pkg/pat sono eccellenti per astrarre questo. – minikomi

risposta

45

Per assicurarsi di servire solo la radice: stai facendo la cosa giusta. In alcuni casi, è necessario chiamare il metodo ServeHttp di un oggetto http.FileServer anziché chiamare NotFound; Dipende dal fatto che tu abbia o meno file misti che vuoi servire.

Per gestire diversi metodi in modo diverso: Molti dei miei gestori HTTP contengono altro che un'istruzione switch in questo modo:

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. 
} 

Naturalmente, si potrebbe scoprire che un pacchetto di terze parti come gorilla funziona meglio per voi.

20

eh, stavo davvero andando a letto e quindi il rapido commento su http://www.gorillatoolkit.org/pkg/mux che è veramente bello e fa quello che vuoi, basta dare un'occhiata ai documenti. Ad esempio

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

e

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

e molte altre possibilità e modi per eseguire le operazioni di cui sopra.

Ma ho sentito il bisogno di affrontare l'altra parte della domanda, "È questo il meglio che posso fare". Se la std lib è un po 'troppo spoglia, una grande risorsa da verificare è qui: https://github.com/golang/go/wiki/Projects#web-libraries (collegato in modo specifico alle librerie web).

Problemi correlati