为什么 Gin 能处理 HTTP 请求?从 GET、POST 到 JSON 返回的完整流程

为什么 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

服务器收到后,需要完成:

  1. 判断用户访问的是哪个地址
  2. 获取用户传递的数据
  3. 执行业务代码
  4. 返回结果

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 /user

Gin:

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

虽然可以实现,但是:

  1. 数据暴露在 URL
  2. 长度有限
  3. 不适合复杂数据

所以现代接口通常:

POST + JSON Body。


记住:

POST 请求主要用于提交数据,数据通常放在请求体 Body 中。


六、Gin 如何获取客户端传来的参数?

客户端传递数据主要有三种方式:

客户端 | | +---- Query参数 | +---- Form表单 | +---- JSON请求体

1. 获取 Query 参数

请求:

GET /user?id=10

Gin:

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=Tom

Gin:

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.Age

ShouldBindJSON 做了什么?

它完成:

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.png

Gin 会找到:

./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

都会建立在这条链路之上。