2017-06-20 23 views
0

空http.Request.Body我使用github.com/pressly/chi建立這個簡單的程序,我嘗試了一些JSON從http.Request.Body解碼:馳在render.Bind

package main 

import (
    "encoding/json" 
    "fmt" 
    "net/http" 

    "github.com/pressly/chi" 
    "github.com/pressly/chi/render" 
) 

type Test struct { 
    Name string `json:"name"` 
} 

func (p *Test) Bind(r *http.Request) error { 
    err := json.NewDecoder(r.Body).Decode(p) 
    if err != nil { 
     return err 
    } 
    return nil 
} 

func main() { 
    r := chi.NewRouter() 

    r.Post("/products", func(w http.ResponseWriter, r *http.Request) { 
     var p Test 
     // err := render.Bind(r, &p) 
     err := json.NewDecoder(r.Body).Decode(&p) 

     if err != nil { 
      panic(err) 
     } 

     fmt.Println(p) 
    }) 

    http.ListenAndServe(":8080", r) 
} 

當我不使用render.Bind()(從"github.com/pressly/chi/render"),它按預期工作。

然而,當我取消對該行err := render.Bind(r, &p)和我的評論線err := json.NewDecoder(r.Body).Decode(&p),它與恐慌EOF

2017/06/20 22:26:39 http: panic serving 127.0.0.1:39696: EOF

,因此json.Decode()失敗。

我做錯了什麼或者是http.Request.Bodyrender.Bind()被調用之前已經在其他地方讀過了嗎?

回答

1

render.Bind的目的是執行解碼並執行Bind(r)做後解碼操作。

對於如:

type Test struct { 
    Name string `json:"name"` 
} 

func (p *Test) Bind(r *http.Request) error { 
    // At this point, Decode is already done by `chi` 
    p.Name = p.Name + " after decode" 
    return nil 
} 

如果你需要做的只是JSON解碼需要相對於解碼值解碼之後進行任何其他操作。只需使用:

// Use Directly JSON decoder of std pkg 
err := json.NewDecoder(r.Body).Decode(&p) 

OR

// Use wrapper method from chi DecodeJSON 
err := render.DecodeJSON(r.Body, &p) 
+0

事實上,我應該有檢查的'源代碼render.Bind' ......這解釋了爲什麼'Body'是空的,因爲它已經是讀。無論如何,謝謝你的解決方案! – jaimelescornichons

+0

@jaimelescornichons不客氣。 – jeevatkm

相關問題