GO,尝试从 cURL 读取 JSON 会给出“<nil>”

问题描述 投票:0回答:1

我正在尝试使用 go-chi 来 CURL 端点,但在从 curl 获取 JSON 时遇到问题,我的代码如下所示

type Message struct {
    From    string `json:"From"`
    Message string `json:"Message"`

}


//in main()
router.Post("/newMessage", func(w http.ResponseWriter, r *http.Request ){          

        var msgStruct Message
    var decoded = json.NewDecoder(r.Body).Decode(&msgStruct)
    fmt.Println(decoded)
        fmt.Println(r.Body)
    p, _ := io.ReadAll(r.Body); fmt.Printf("%s\n", p)

    })

我的卷发

curl -X POST http://localhost:8000/newMessage -d '{"From": "me", "Message": "msg"}' -H "Content-Type: application/json" 

控制台会记录什么内容

&{0xc000134150 <nil> <nil> false true {0 0} true false false 0x656820}
<nil>
// nothing get printed from the io.ReadAll

我是 GO 新手,所以我在调试这个问题上运气不佳。我尝试按照网上的说明进行操作,但不幸的是,处理 POST 的方法并不多,而且我发现没有一个使用curl 和 go 的方法。

提前致谢

json go curl go-chi
1个回答
0
投票

这里有一些错误。

  • r.Body
    是一个流,因此在使用后,除非您缓冲或重置它,否则无法再次读取它。
  • json.NewDecoder(r.Body).Decode
    Decode 的返回值是一个错误,而不是解码后的数据本身。

让我们解决它:

type Message struct {
    From    string `json:"From"`
    Message string `json:"Message"`
}

router.Post("/newMessage", func(w http.ResponseWriter, r *http.Request) {
        var msgStruct Message

        // Decode JSON directly into the struct
        if err := json.NewDecoder(r.Body).Decode(&msgStruct); err != nil {
            http.Error(w, "Failed to decode JSON", http.StatusBadRequest)
            fmt.Println("Error decoding JSON:", err)
            return
        }

        // Log the received message
        fmt.Printf("Received Message: %+v\n", msgStruct)
})
© www.soinside.com 2019 - 2024. All rights reserved.