我想制作中间件func以检查令牌的有效性,但在最后一个函数中我无法获得它的请求的后置值。
这里我把“简短”(代码只显示主要想法)
func main() {
http.Handle("/100000/000001", Verify(http.HandlerFunc(Insert)))
}
func Verify(next http.Handler) http.Handler
{
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var reqBody RequestBody
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&reqBody)
Util.CheckErr(err)
var token = RequestHeader{Token: r.Header.Get("_Token")}
if token == dbToken {
next.ServeHTTP(w, r)
} else {
Util.PutResponseMessage(w, "003", "Access danied")
}
})
}
func Insert(res http.ResponseWriter, req *http.Request) {
var requestBody InsertRequestBody
decoder := json.NewDecoder(req.Body)
err := decoder.Decode(&requestBody)
if err != nil {
panic(err)
}
defer req.Body.Close()
log.Println(requestBody.Username)
}
我得到这样的错误:
http: panic serving [::1]:51269: EOF
goroutine 6 [running]:
net/http.(*conn).serve.func1(0xc0420348c0)
C:/Go/src/net/http/server.go:1721 +0xd7
panic(0x6884e0, 0xc042008110)
但是,如果我直接返回next.ServeHttp(r,w)
像这样:func Verify(next http.Handler) http.Handler
{
next.ServeHTTP(w, r)
}
然后Insert func中的解码过程完美运行。
为什么?任何答案都将高度赞赏。三江源