为什么 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服务器收到后需要完成判断用户访问的是哪个地址获取用户传递的数据执行业务代码返回结果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 /userGinGET /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?id10这里?id10就是参数。这种参数叫Query 参数Gin 获取router.GET(/user,func(c*gin.Context){id:c.Query(id)c.String(200,id)})请求/user?id10获取10为什么 GET 参数放 URL因为 GET 的主要目的就是查询。例如搜索/search?keywordgolang分页/users?page2这些数据不会改变服务器状态所以适合放 URL。记住GET 请求主要用于获取数据参数通常放在 URL 中。五、POST 请求为什么数据放在请求体POST英文Post提交作用向服务器提交数据。常见场景用户登录用户注册创建订单上传信息例如登录POST /login提交{username:Tom,password:123456}这些数据放在哪里答案请求体 Body。为什么不用 URL例如/login?usernameTompassword123456虽然可以实现但是数据暴露在 URL长度有限不适合复杂数据所以现代接口通常POST JSON Body。记住POST 请求主要用于提交数据数据通常放在请求体 Body 中。六、Gin 如何获取客户端传来的参数客户端传递数据主要有三种方式客户端 | | ---- Query参数 | ---- Form表单 | ---- JSON请求体1. 获取 Query 参数请求GET /user?id10Ginid: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 参数传统表单forminputnameusername/form提交usernameTomGinusername:c.PostForm(username)3. 获取 JSON 请求体现在前后端分离项目最常见。前端发送{username:Tom,age:20}后端定义结构体typeUserstruct{Usernamestringjson:usernameAgeintjson:age}解析varuser User c.ShouldBindJSON(user)解析后user.Username user.AgeShouldBindJSON 做了什么它完成JSON字符串 | v Go结构体也就是数据格式转换。记住请求参数获取本质就是把 HTTP 中的数据转换成 Go 可以使用的数据。七、为什么后端喜欢返回 JSONJSON全称JavaScript Object Notation是一种数据交换格式。例如服务器返回{code:200,message:success,data:{name:Tom}}前端JavaScriptVueReact都可以直接解析。所以现在前后端分离项目中后端 Go | JSON | 前端 Vue是非常常见的模式。八、Gin 如何返回 JSONGin使用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包括图片CSSJavaScriptHTML视频十二、静态文件和动态数据有什么区别静态文件例如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都会建立在这条链路之上。