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

如何用Gin框架记录或打印接收的请求?未知结构JSON打印方法

刚好之前碰到过类似的场景,给你分享两种简单的实现方式,都能轻松打印出未知结构的JSON请求数据:

方法1:直接读取原始请求体(最直观)

这种方式能拿到请求的原始JSON字符串,不管结构如何都能完整打印,适合快速排查问题。注意一定要重置请求体,因为Gin的请求Body只能读取一次,不重置的话后续的绑定操作会失败。

import (
    "fmt"
    "io"
    "bytes"
    "net/http"
    "github.com/gin-gonic/gin"
)

func createOrUpdateInfluencer(c *gin.Context) {
    // 读取原始请求体内容
    body, err := io.ReadAll(c.Request.Body)
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "failed to read request body"})
        return
    }

    // 打印原始JSON字符串
    fmt.Printf("Received raw request body:\n%s\n", string(body))

    // 关键步骤:重置请求体,让后续的Bind/ShouldBind方法能正常读取
    c.Request.Body = io.NopCloser(bytes.NewBuffer(body))

    // 这里继续你的业务逻辑...
}

如果想让打印的JSON更美观(带缩进),可以加个格式化处理:

import "encoding/json"

// 在读取body之后添加:
var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, body, "", "  "); err == nil {
    fmt.Printf("Received formatted request body:\n%s\n", prettyJSON.String())
}
方法2:解析为通用Map后打印(更结构化)

这种方式会自动把JSON解析成键值对的map[string]interface{},打印出来的内容层级更清晰,嵌套对象和数组也能直观展示。

import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
)

func createOrUpdateInfluencer(c *gin.Context) {
    // 定义通用map接收任意结构的JSON
    var requestData map[string]interface{}
    if err := c.ShouldBindJSON(&requestData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "invalid JSON format"})
        return
    }

    // 格式化打印解析后的结构,%+v会展开所有键值对
    fmt.Printf("Received parsed request data:\n%+v\n", requestData)

    // 后续业务逻辑...
}

两种方法各有优势:如果只是想快速看原始数据选方法1,如果需要结构化查看数据选方法2,根据你的需求来就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:34:12