在 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 |
灵活绑定:将错误返回给调用者,允许自定义错误处理逻辑(推荐)。 |
常见问题排查
返回空值
-检查结构体字段是否为导出字段(首字母大写)。 -确保 JSON key 和结构体标签一致。415 Unsupported Media Type
客户端必须设置 Header:req.Header.Set("Content-Type", "application/json")
大文件优化
使用c.Request.Body
+json.NewDecoder()
:var user User decoder := json.NewDecoder(c.Request.Body) if err := decoder.Decode(&user); err != nil { ... }
动态 JSON (未知字段)
用map[string]interface{}
:
var data map[string]interface{}
if err := c.ShouldBindJSON(&data); err != nil { ... }
如果需要更复杂的功能(如参数校验、中间件),可以结合 Gin 的验证库或自定义中间件实现。
内容由零声教学AI助手提供,问题来源于学员提问