我正在尝试使用 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 的方法。
提前致谢
这里有一些错误。
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)
})