我试图在golang中关闭处理GET请求。 我只是想处理POST。
有可能吗?
这样做的原因是,每当我转到localhost:8080并多次刷新页面时,我可以看到golang分配的内存越来越多。
这是我的测试代码:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
type test_struct struct {
Test string
}
var t test_struct
func handlePOST(rw http.ResponseWriter, req *http.Request) {
switch req.Method {
case "POST":
decoder := json.NewDecoder(req.Body)
decoder.Decode(&t)
defer req.Body.Close()
fmt.Println(t.Test)
}
}
func main() {
http.HandleFunc("/", handlePOST)
http.ListenAndServe(":8080", nil)
}
答案 0 :(得分:2)
您无法处理GET
个请求,Go的HTTP服务器(或者更确切地说是它的http.ServeMux
)只允许您在将请求分派给处理程序之前指定路径模式。与HTTP方法相关的路由只能在处理程序级别进行。
请注意,某些外部mux库允许您仅将处理程序注册到特定的HTTP方法,但基于此的决策和路由也会发生在" hidden"这些图书馆的处理程序。
您正在做的是最好的:如果HTTP方法不是您想要处理的方法,或者更好的方法,只需在处理程序中不执行任何操作:发送回http.StatusMethodNotAllowed
错误响应:
func myHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST is allowed", http.StatusMethodNotAllowed)
return
}
var t test_struct // Use local var not global, else it's a data race
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&t); err != nil {
fmt.Println("Error decoding:", err)
}
fmt.Println(t.Test)
}