ZBLOG

Gin 框架 Post 获取JSON

Gin 框架 中,处理 HTTP POST 请求并获取 JSON 数据非常简单。以下是完整的示例代码和关键步骤说明:


1. 服务端接收 JSON 数据

安装 Gin

go get -u github.com/gin-gonic/gin

示例代码

package main

import (
	"github.com/gin-gonic/gin"
)

// 定义接收 JSON 的结构体
type User struct {
	Name string `json:"name"` // 字段标签指明对应的 JSON key
	Age  int    `json:"age"`
}

func main() {
	r := gin.Default()

	// POST 路由:解析 JSON Body
	r.POST("/user", func(c *gin.Context) {
		var user User

		//  1.  将请求 Body 中的 JSON 绑定到结构体
		if err := c.ShouldBindJSON(&user); err != nil {
			c.JSON(400, gin.H{"error": err.Error()})
			return
		}

		//  2.  处理数据(示例:打印并返回)
		c.JSON(200, gin.H{
			"status": "success",
			"data":   user,
		})
	})

	r.Run(":8080") // 监听 :8080
}

关键点说明

  • ShouldBindJSON:
    自动将请求的 JSON Body 解析到指定的结构体(如 User),无需手动操作 r.Body
  • 错误处理:
    若 JSON 格式不匹配或字段类型错误,会返回 400 Bad Request
  • 字段标签:
    结构体的 `json:"xxx"` 标签指定了与 JSON key 的映射关系。

2. 客户端发送 JSON(测试工具)

(1) CURL

curl -X POST http://localhost:8080/user \
-H "Content-Type: application/json" \
-d '{"name":"Alice","age":25}'

(2) Go HTTP Client

package main

import (
    "bytes"
    "encoding/json"
    "net/http"
)

func main() {
    data := map[string]interface{}{"name": "Bob", "age":30}
    jsonData, _ := json.Marshal(data)
    
    resp, err := http.Post(
        "http://localhost:8080/user",
        "application/json",
        bytes.NewBuffer(jsonData),
    )
    defer resp.Body.Close()
}

3. Gin + BindJSON vs ShouldBindJSON

API Behavior
BindJSON 严格绑定:出现错误时直接返回 400,不会继续执行后续代码。
ShouldBindJSON 灵活绑定:将错误返回给调用者,允许自定义错误处理逻辑(推荐)。

常见问题排查

  1. 返回空值
    -检查结构体字段是否为导出字段(首字母大写)。 -确保 JSON key 和结构体标签一致。

  2. 415 Unsupported Media Type
    客户端必须设置 Header:

    req.Header.Set("Content-Type", "application/json")
    
  3. 大文件优化
    使用 c.Request.Body + json.NewDecoder()

    var user User 
    decoder := json.NewDecoder(c.Request.Body)
    if err := decoder.Decode(&user); err != nil { ... }
    
  4. 动态 JSON (未知字段)
    map[string]interface{}

var data map[string]interface{}
if err := c.ShouldBindJSON(&data); err != nil { ... }

如果需要更复杂的功能(如参数校验、中间件),可以结合 Gin 的验证库或自定义中间件实现。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23754

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?