duanben1909 2017-06-20 21:40
浏览 52
已采纳

在render.Bind中清空空的http.Request.Body

I am using github.com/pressly/chi to build this simple program where I try to decode some JSON from the http.Request.Body:

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)
}

When I don't use render.Bind() (from "github.com/pressly/chi/render"), it works as expected.

However, when I uncomment the line err := render.Bind(r, &p) and I comment the line err := json.NewDecoder(r.Body).Decode(&p), it panics with EOF :

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

and thus the json.Decode() fails.

Am I doing something wrong or is the http.Request.Body is already read somewhere else before render.Bind() is called?

  • 写回答

1条回答 默认 最新

  • dongzi1959 2017-06-20 22:07
    关注

    render.Bind's purpose is to perform decode and execute Bind(r) to do post decode operations.

    For eg.:

    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
    }
    

    If you have to do only JSON decode no other actions needs to be done after decode with respect to decoded values. Just use:

    // 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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ADS生成的微带线为什么是蓝色空心的
  • ¥15 求一下解题思路,完全不懂
  • ¥15 tensorflow
  • ¥15 densenet网络结构中,特征以cat方式复用后是怎么进行误差回传的
  • ¥15 STM32G471芯片spi设置了8位,总是发送16位
  • ¥15 R语言并行计算beta-NTI中tree文件的类型
  • ¥15 如何解读marsbar导出的ROI数据?
  • ¥20 求友友协助弄一下基于STC89C52单片机的声光控制灯原理图
  • ¥15 arduino双向交通灯设计
  • ¥15 有没有会粒子群算法的大能(○゜ε^○)求带不会出收敛图😭