为什么 Gin 能处理 HTTP 请求?从 GET、POST 到 JSON 返回的完整流程
在学习 Gin 框架时,很多初学者会直接接触:
router.GET()router.POST()然后开始写接口。
但是很多人都会产生一些疑问:
- 浏览器发送请求后,Gin 是怎么知道执行哪个函数的?
- GET 和 POST 到底有什么区别?
- 前端传来的参数,Gin 是怎么获取的?
- 为什么现在后端接口大多返回 JSON?
- 图片、HTML 页面这些文件,Gin 又是怎么返回的?
这些问题看起来是不同的知识点,实际上都围绕一个核心流程:
客户端发送 HTTP 请求 → Gin 接收请求 → 获取参数 → 处理业务 → 返回响应
理解这条链路,Gin 中大部分内容都会变得容易。
一、Gin 本质解决了什么问题?
首先需要理解 Web 应用的基本模型。
一个完整的请求过程:
客户端(浏览器 / App) | | HTTP Request | v Gin服务器 | | 路由匹配 | | 参数解析 | | 业务处理 | v HTTP Response | v 客户端接收结果例如:
用户打开网页:
http://localhost:8080/user浏览器会发送:
GET /user服务器收到后,需要完成:
- 判断用户访问的是哪个地址
- 获取用户传递的数据
- 执行业务代码
- 返回结果
Gin 做的事情,就是把 HTTP 请求和 Go 代码连接起来。
二、HTTP 请求到底是什么?
在学习 Gin 前,需要先理解 HTTP。
HTTP:
全称:
HyperText Transfer Protocol(超文本传输协议)
它规定了:
客户端和服务器之间如何通信。
一次请求主要包含:
HTTP Request ├── Method 请求方法 │ ├── URL 地址 │ ├── Header 请求头 │ └── Body 请求体例如:
用户登录:
POST /login HTTP/1.1 Content-Type: application/json { "username":"admin", "password":"123456" }这里:
POST
表示:
我要提交数据。
URL
表示:
我要访问哪个接口。
Header
表示:
请求的额外信息。
例如:
Content-Type: application/json告诉服务器:
下面的数据是 JSON 格式。
Body
表示:
真正提交的数据。
例如:
{"username":"admin","password":"123456"}记住:
HTTP 请求就是客户端向服务器描述:“我要访问哪里,以及我要传递什么数据”。
三、Gin 如何知道执行哪个函数?
答案:
路由 Router
路由:
英文:
Router
作用:
根据请求的 URL 和 Method,找到对应的处理函数。
例如:
客户端:
GET /userGin:
GET /user ↓ 执行对应函数代码:
router.GET("/user",func(c*gin.Context){c.String(200,"用户信息")})其中:
GET表示请求方法。
/user表示 URL 路径。
函数:
func(c*gin.Context)表示:
收到请求后执行的代码。
为什么需要路由?
假设一个网站有:
/user /login /order如果没有路由:
服务器不知道:
访问/user应该执行什么代码。
所以:
路由就是 HTTP 请求和代码之间的映射关系。
四、GET 请求:为什么参数放在 URL 中?
GET:
英文:
Get(获取)
作用:
从服务器获取数据。
例如:
查询用户:
GET /user?id=10这里:
?id=10就是参数。
这种参数叫:
Query 参数
Gin 获取:
router.GET("/user",func(c*gin.Context){id:=c.Query("id")c.String(200,id)})请求:
/user?id=10获取:
10为什么 GET 参数放 URL?
因为 GET 的主要目的:
就是查询。
例如:
搜索:
/search?keyword=golang分页:
/users?page=2这些数据不会改变服务器状态,所以适合放 URL。
记住:
GET 请求主要用于获取数据,参数通常放在 URL 中。
五、POST 请求:为什么数据放在请求体?
POST:
英文:
Post(提交)
作用:
向服务器提交数据。
常见场景:
- 用户登录
- 用户注册
- 创建订单
- 上传信息
例如:
登录:
POST /login提交:
{"username":"Tom","password":"123456"}这些数据放在哪里?
答案:
请求体 Body。
为什么不用 URL?
例如:
/login?username=Tom&password=123456虽然可以实现,但是:
- 数据暴露在 URL
- 长度有限
- 不适合复杂数据
所以现代接口通常:
POST + JSON Body。
记住:
POST 请求主要用于提交数据,数据通常放在请求体 Body 中。
六、Gin 如何获取客户端传来的参数?
客户端传递数据主要有三种方式:
客户端 | | +---- Query参数 | +---- Form表单 | +---- JSON请求体1. 获取 Query 参数
请求:
GET /user?id=10Gin:
id:=c.Query("id")例如:
router.GET("/user",func(c*gin.Context){id:=c.Query("id")c.JSON(200,gin.H{"id":id,})})返回:
{"id":"10"}2. 获取 Form 参数
传统表单:
<form><inputname="username"></form>提交:
username=TomGin:
username:=c.PostForm("username")3. 获取 JSON 请求体
现在前后端分离项目最常见。
前端发送:
{"username":"Tom","age":20}后端定义结构体:
typeUserstruct{Usernamestring`json:"username"`Ageint`json:"age"`}解析:
varuser User c.ShouldBindJSON(&user)解析后:
user.Username user.AgeShouldBindJSON 做了什么?
它完成:
JSON字符串 | v Go结构体也就是:
数据格式转换。
记住:
请求参数获取,本质就是把 HTTP 中的数据转换成 Go 可以使用的数据。
七、为什么后端喜欢返回 JSON?
JSON:
全称:
JavaScript Object Notation
是一种数据交换格式。
例如:
服务器返回:
{"code":200,"message":"success","data":{"name":"Tom"}}前端:
JavaScript
Vue
React
都可以直接解析。
所以:
现在前后端分离项目中:
后端 Go | JSON | 前端 Vue是非常常见的模式。
八、Gin 如何返回 JSON?
Gin:
使用:
c.JSON()例如:
router.GET("/user",func(c*gin.Context){c.JSON(200,gin.H{"name":"Tom","age":20,})})返回:
{"name":"Tom","age":20}九、gin.H 是什么?
经常看到:
gin.H{}它本质:
map[string]interface{}也就是:
Go 的 map。
例如:
gin.H{"name":"Tom","age":20}表示:
{"name":"Tom","age":20}作用:
快速生成 JSON。
十、HTTP 状态码
返回:
c.JSON(200,data)这里:
200叫:
状态码。
常见:
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 201 | 创建成功 |
| 400 | 参数错误 |
| 401 | 未认证 |
| 403 | 无权限 |
| 404 | 资源不存在 |
| 500 | 服务器错误 |
十一、什么是静态文件?
静态文件:
英文:
Static File
意思:
内容固定,服务器直接返回的文件。
例如:
static ├── logo.png ├── style.css └── app.js包括:
- 图片
- CSS
- JavaScript
- HTML
- 视频
十二、静态文件和动态数据有什么区别?
静态文件
例如:
logo.png所有用户看到一样。
流程:
客户端 请求图片 ↓ 服务器找到文件 ↓ 直接返回动态数据
例如:
用户信息:
{"name":"Tom","age":20}不同用户不同。
流程:
请求 ↓ 业务代码处理 ↓ 查询数据库 ↓ 生成数据 ↓ 返回 JSON十三、Gin 如何返回静态文件?
项目:
project ├── main.go └── static └── logo.png代码:
router.Static("/static","./static")访问:
http://localhost:8080/static/logo.pngGin 会找到:
./static/logo.png然后返回图片。
十四、Gin 还能返回 HTML 页面
除了 JSON:
服务器也可以返回网页。
例如:
目录:
templates index.html加载:
router.LoadHTMLGlob("templates/*")返回:
c.HTML(200,"index.html",gin.H{"title":"首页",},)浏览器显示 HTML 页面。
十五、GET、POST、JSON、静态文件之间的关系
整体流程:
客户端 | | HTTP Request | v Gin Router | +-----------+-----------+ | | GET POST | | URL参数 Body请求体 | | JSON | v 业务逻辑处理 | +-----------+-----------+ | | JSON 静态文件 | | v v 数据响应 文件响应十六、总结:Gin 的核心思想
Gin 并不是负责创造 HTTP。
它解决的问题是:
如何更方便地接收 HTTP 请求,并把请求中的数据交给 Go 代码处理,再返回客户端需要的结果。
整个过程:
HTTP请求 ↓ Gin路由匹配 ↓ 获取参数 (Query/Form/JSON) ↓ 业务处理 ↓ 返回响应 (JSON/HTML/文件)记住:
Gin 的核心就是连接「客户端请求」和「服务器代码」。
理解:
请求从哪里来 → 数据如何获取 → 业务如何处理 → 结果如何返回
后续学习 Gin 的:
- 中间件 Middleware
- 参数校验
- 登录认证
- JWT
- 数据库操作
- RESTful API
都会建立在这条链路之上。