这篇笔记梳理了 POST 请求在 Gin 中的完整流程,从 URL 匹配、数据发送,到结构体绑定和返回响应,帮助你理清前后端交互过程。
1. URL 路径决定调用哪个函数
Gin 根据请求的 URL 路径匹配路由,找到对应的处理函数执行。
go
r.POST("/register", controller.Register) // /register → Register()
r.POST("/login", controller.Login) // /login → Login()
使用 curl 测试:
bash
curl -X POST http://localhost:9000/register # 路径 /register → 调 Register
curl -X POST http://localhost:9000/login # 路径 /login → 调 Login
URL 路径就是"门牌号",告诉 Gin 请求该交给哪个处理函数。
2. curl 发送 POST 数据的两种方式
方式 1:直接在命令里写 JSON
bash
curl.exe -X POST http://localhost:9000/register \
-H "Content-Type: application/json" \
-d '{"username":"lisi","password":"123456"}'
方式 2:用 JSON 文件
bash
# data.json 内容:
# {"username":"lisi","password":"123456"}
curl.exe -X POST http://localhost:9000/register \
-H "Content-Type: application/json" \
--data-binary "@data.json"
@表示从文件读取数据发送。
3. curl 命令逐块解析
示例命令:
bash
curl.exe -X POST http://localhost:9000/v1/todo \
-H "Content-Type: application/json" \
--data-binary "@data.json"
| 部分 | 说明 |
|---|---|
curl.exe |
curl 工具 |
-X POST |
发 POST 请求 |
http://localhost:9000/v1/todo |
请求地址(URL) |
-H "Content-Type: application/json" |
请求头:告诉服务器我发的是 JSON |
--data-binary "@data.json" |
从文件读取 JSON 数据,放入请求 Body |
4. c.ShouldBindJSON(&body) 接收数据
在 Gin 后端:
go
func Register(c *gin.Context) {
var body struct {
Username string `json:"username"`
Password string `json:"password"`
}
c.ShouldBindJSON(&body)
// 此时:
// body.Username = "lisi"
// body.Password = "123456"
}
赋值过程:
- Gin 读取请求 Body
- 根据结构体标签
json:"..."匹配字段 - 将 JSON 数据填入结构体字段
- 结构体现在就可以直接使用
5. POST 请求完整流程
txt
终端输入:
curl -X POST /register -d '{"username":"lisi","password":"123456"}'
↑ 路径 ↑ Body 数据
Gin 收到请求:
→ 匹配 POST /register → 找到 Register 函数
→ c.ShouldBindJSON(&body) → 把 Body 装进结构体
→ body.Username = "lisi", body.Password = "123456"
→ 处理业务逻辑
→ c.JSON 返回结果给前端
这就是 POST 请求从发送到返回的完整流程。
6. 对应前端 fetch
| curl 命令 | 前端 JS fetch |
|---|---|
-X POST |
method: 'POST' |
-H "Content-Type: application/json" |
headers: { 'Content-Type': 'application/json' } |
--data-binary "@data.json" |
body: JSON.stringify({...}) |
| URL | fetch('/register', {...}) |
理解 curl 和 fetch 的对应关系,便于测试接口和前端开发对接。