从中间件发送发布请求

时间:2017-08-11 09:01:58

标签: go

我想制作中间件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中的解码过程完美运行。

为什么?任何答案都将高度赞赏。三江源

0 个答案:

没有答案