使用go-chi接收curl POST JSON数据时返回<nil>无法读取的问题
解决Go-Chi中POST请求无法读取JSON数据的问题
你的核心问题有两个:
- HTTP请求体
r.Body是一次性可读流,用json.Decoder读取后,流的指针已移到末尾,后续再用io.ReadAll就读不到内容了。 - 没有正确处理
Decode方法返回的错误,无法确认JSON解码是否成功。
修正后的代码
type Message struct { From string `json:"From"` Message string `json:"Message"` } // 在main()中 router.Post("/newMessage", func(w http.ResponseWriter, r *http.Request ){ var msgStruct Message // 捕获并处理解码错误 err := json.NewDecoder(r.Body).Decode(&msgStruct) if err != nil { http.Error(w, "JSON解码失败: "+err.Error(), http.StatusBadRequest) return } // 直接打印解析后的结构体内容 fmt.Printf("解析后的消息: %+v\n", msgStruct) // 若需重复读取请求体,可先将内容存入内存再复用 // 示例代码: // bodyBytes, err := io.ReadAll(r.Body) // if err != nil { // http.Error(w, "读取请求体失败", http.StatusInternalServerError) // return // } // // 重新构造可读的请求体 // r.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // // 用读取到的字节再次解码 // var msg Message // err = json.Unmarshal(bodyBytes, &msg) })
原代码输出异常的原因
- 你打印的
decoded是Decode返回的错误对象,解码成功时它为nil,直接打印会输出错误结构体的内存地址等冗余信息。 r.Body被Decoder读取完毕后,流已耗尽,因此io.ReadAll返回空内容。- 输出的
<nil>并非指r.Body为nil,而是流已无内容可读。
验证curl请求
你的curl命令是正确的,无需修改。修正代码后重启服务,执行curl命令,控制台会输出:
解析后的消息: {From:me Message:msg}
额外提示
- 处理HTTP请求时必须检查所有可能的错误(如解码、读取请求体错误),并返回对应HTTP状态码给客户端。
- 若需多次读取请求体,需先将内容读取到内存,再重新构造
io.ReadCloser赋值给r.Body。
内容的提问来源于stack exchange,提问作者user28465074
相关产品推荐
相关产品推荐

