2017-09-05 28 views
0

我正試圖關閉處理golang中的GET請求。 我只想處理POST。不處理網絡/ http golang中的GET

可以嗎?

這樣做的原因是,我可以看到越來越多的內存被golang分配,只要我多次訪問本地主機:8080和刷新頁面。

這裏是我的測試代碼:

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

所以有什麼問題? –

+0

即使功能未定義,我也可以看到Golang處理GET請求。每當我去我的程序的端口,我可以看到內存被分配,這增加了內存使用量。我想避免這種行爲。 – Mac

+1

「我可以看到分配的內存會增加內存使用量」可能不會。發現泄漏的內存很難。查看過程監視器或頂部是沒有用的。所以有什麼問題? – Volker

回答

2

而且不能處理GET請求,Go的HTTP服務器(或者更確切地說,它http.ServeMux)只允許您將請求分派到您的處理之前指定的路徑模式。 HTTP方法相關的路由只能在處理程序級別發生。

注意的是有些外部MUX庫允許您註冊處理程序,只有特定的HTTP方法,但基於這一決定和路由也發生在這些庫的「隱藏」的處理程序。

你在做什麼是最好的:根本就沒有什麼處理程序,如果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) 
}