snippetgoMinor
How can I handle http requests of different methods to / in Go?
Viewed 0 times
differenthowmethodshandlecanrequestshttp
Problem
I'm trying to figure out the best way to handle requests to
Is this idiomatic Go? Is this the best I can do with the standard http lib? I'd much rather do something like
Thank you for your advice.
/ and only / in Go and handle different methods in different ways. Here's the best I've come up with: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))
}Is this idiomatic Go? Is this the best I can do with the standard http lib? I'd much rather do something like
http.HandleGet("/", handler) as in express or Sinatra. Is there a good framework for writing simple REST services? web.go looks attractive but appears stagnant.Thank you for your advice.
Solution
From Go 1.22.0 on you can put the HTTP method before the endpoint
https://go.dev/blog/routing-enhancements
package main
import (
"net/http"
)
func main() {
router := http.NewServeMux()
router.HandleFunc("GET /", myHandler)
router.HandleFunc("GET /other", myOtherHandler)
router.HandleFunc("POST /data", myPostHandler)
http.ListenAndServe(":8080", router)
}https://go.dev/blog/routing-enhancements
Code Snippets
package main
import (
"net/http"
)
func main() {
router := http.NewServeMux()
router.HandleFunc("GET /", myHandler)
router.HandleFunc("GET /other", myOtherHandler)
router.HandleFunc("POST /data", myPostHandler)
http.ListenAndServe(":8080", router)
}Context
Stack Overflow Q#15240884, score: 16
Revisions (0)
No revisions yet.