You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原代码输出异常的原因

  1. 你打印的decoded是Decode返回的错误对象,解码成功时它为nil,直接打印会输出错误结构体的内存地址等冗余信息。
  2. r.Body被Decoder读取完毕后,流已耗尽,因此io.ReadAll返回空内容。
  3. 输出的<nil>并非指r.Body为nil,而是流已无内容可读。

验证curl请求

你的curl命令是正确的,无需修改。修正代码后重启服务,执行curl命令,控制台会输出:

解析后的消息: {From:me Message:msg}

额外提示

  • 处理HTTP请求时必须检查所有可能的错误(如解码、读取请求体错误),并返回对应HTTP状态码给客户端。
  • 若需多次读取请求体,需先将内容读取到内存,再重新构造io.ReadCloser赋值给r.Body。

内容的提问来源于stack exchange,提问作者user28465074

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:40:04