1. 什么是 API
在 Web 开发中,API 是前后端交互的桥梁。
API(Application Programming Interface),即应用程序编程接口,是一组定义不同软件组件之间如何交互的规则和规范。
1.1. 举个栗子
当你在百度输入框中键入 “天气”,按下回车,页面背后就通过 API 向服务器请求了搜索结果。
flowchart LR
A[🧑 用户操作<br>在百度输入“天气”并搜索] --> B(🌐 浏览器(前端)<br>发起请求到百度服务器)
B --> C(🖥️ 服务器(后端)<br>接收请求并查找结果)
C --> D(📦 服务器返回数据<br>发送 HTML/JSON 给前端)
D --> E[🎨 浏览器渲染页面<br>展示搜索结果]
1.2. API 作用
功能 | 描述 |
---|---|
🔗 软件通信 | 不同系统之间可以通过 API 进行协作 |
📡 数据交换 | 前端与后端通过 API 实现数据传输 |
🧱 模块解耦 | 前后端分离,彼此无需了解实现细节 |
🤖 自动化调用 | 可以通过脚本/代码触发接口,实现自动化流程(如下单、批量上传等) |
🌍 接入服务 | 可调用第三方服务:微信登录、地图、天气、支付等 |
1.3. API 常见类型
类型 | 描述 |
---|---|
🌐 REST API | 基于 HTTP 协议的资源风格 API,最常见 |
🔒 SOAP API | 基于 XML 的协议,结构复杂、企业场景使用较多 |
⚡ GraphQL API | Facebook 推出的一种按需查询型 API |
🧱 本地库 API | 系统/语言提供的函数接口,如文件/网络/图形操作等 |
1.4. 推荐使用 REST 风格 API
如果不使用 REST 风格,只用 GET
和 POST
,我们可能需要这样设计 API:
作用 | 方法 | API 地址 |
---|---|---|
获取数据 | GET | /getUser |
新增数据 | POST | /addUser |
更新数据 | POST | /updateUser |
删除数据 | POST | /deleteUser |
使用 REST 风格后,我们可以统一路径,更直观地通过 HTTP 方法 表达操作意图:
作用 | 方法 | API 地址 |
---|---|---|
获取用户 | GET | /user |
创建用户 | POST | /user |
更新用户 | PUT | /user |
删除用户 | DELETE | /user |
REST API 的优势:
- 简洁统一
- 更语义化
- 更利于前后端协作与维护
1.5. Apifox(测试 API)
- Apifox 是一款集 API 文档、调试、Mock、自动化测试于一体的协作平台,旨在提升研发团队的效率。
- Apifox = Postman + Swagger + Mock + JMeter
- 官方网站:https://apifox.com/
2. 什么是 Gin
Gin 是一个用 Go(Golang)语言 编写的高性能、轻量级 Web 框架,专为构建快速、简洁的 Web 应用和 API 而设计,类似于 Python 的 Flask 或 Node.js 的 Express。
2.1. Gin 的核心特点
特点 | 描述 |
---|---|
🚀 高性能 | 基于 Radix Tree 的路由和零内存拷贝,处理请求非常快 |
🧩 中间件支持 | 支持全局或局部中间件(如日志、认证、CORS、限流等) |
🛠️ RESTful 路由 | 提供类似 RESTful 风格的路由设计,支持路径参数、通配符等 |
📦 JSON 处理 | 原生支持 JSON 数据绑定、序列化与解析 |
🧪 请求绑定与验证 | 支持结构体参数绑定和请求参数验证(如表单、JSON、QueryString) |
🔒 错误处理机制 | 自定义错误处理逻辑,捕捉异常并返回统一格式 |
📚 丰富文档 | 社区活跃,官方和第三方资源多,学习成本低 |
Apifox 是一款集 API 文档、调试、Mock、自动化测试于一体的协作平台,旨在提升研发团队的效率。
API 测试工具
API 设计、开发、测试一体化协作平台
Apifox = Postman + Swagger + Mock + JMeter
https://apifox.com/
2.2. 安装 Gin
go get -u github.com/gin-gonic/gin
2.3. 快速上手示例
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default() // 创建默认路由(带日志和恢复中间件)
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run(":8080") // 启动服务,监听 8080 端口
}
访问 http://localhost:8080/ping 会返回:
{
"message": "pong"
}
2.4. 路由参数
r.GET("/user/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{"user_id": id})
})
2.5. POST 请求处理 + 数据绑定
type Login struct {
User string `json:"user" binding:"required"`
Pass string `json:"pass" binding:"required"`
}
r.POST("/login", func(c *gin.Context) {
var login Login
if err := c.ShouldBindJSON(&login); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"status": "ok"})
})
2.6. 使用中间件
r.Use(func(c *gin.Context) {
fmt.Println("每个请求都会经过这里")
c.Next()
})