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 APIFacebook 推出的一种按需查询型 API
🧱 本地库 API系统/语言提供的函数接口,如文件/网络/图形操作等

1.4. 推荐使用 REST 风格 API

如果不使用 REST 风格,只用 GETPOST,我们可能需要这样设计 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()
})
Last modification:April 23, 2025
喜欢我的文章吗? 别忘了点赞或赞赏,让我知道创作的路上有你陪伴。