全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 7 分钟 ✍️ juanwangdev

RESTful风格API设计

RESTful 是 Web API 设计的推荐风格,强调资源导向和统一接口。

RESTful 核心原则

原则说明
资源导向URL 表示资源,而非动作
HTTP 方法语义使用标准方法表示操作
无状态每次请求包含完整信息
统一接口一致的 URL 和响应格式

HTTP 方法语义

方法语义URL 示例
GET获取资源/users/users/:id
POST创建资源/users
PUT更新资源(全量)/users/:id
PATCH更新资源(部分)/users/:id
DELETE删除资源/users/:id

资源命名规范

Go
// ✅ 推荐:资源名词,复数表示集合
r.GET("/users", listUsers)         // 用户列表
r.GET("/users/:id", getUser)       // 单个用户
r.POST("/users", createUser)       // 创建用户
r.PUT("/users/:id", updateUser)    // 更新用户
r.DELETE("/users/:id", deleteUser) // 删除用户

// ❌ 不推荐:动词在 URL 中
r.GET("/getUser", ...)             // 动词不应出现在 URL
r.POST("/createUser", ...)

完整 RESTful 示例

Go
type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

var users = []User{
    {ID: 1, Name: "张三", Age: 25},
    {ID: 2, Name: "李四", Age: 30},
}

func main() {
    r := gin.Default()

    // 获取用户列表
    r.GET("/users", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "code": 0,
            "data": users,
        })
    })

    // 获取单个用户
    r.GET("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        for _, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                c.JSON(200, gin.H{"data": u})
                return
            }
        }
        c.JSON(404, gin.H{"error": "用户不存在"})
    })

    // 创建用户
    r.POST("/users", func(c *gin.Context) {
        var user User
        c.ShouldBindJSON(&user)
        user.ID = len(users) + 1
        users = append(users, user)
        c.JSON(201, gin.H{"data": user})
    })

    // 更新用户
    r.PUT("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        var updateUser User
        c.ShouldBindJSON(&updateUser)

        for i, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                users[i] = updateUser
                users[i].ID = u.ID
                c.JSON(200, gin.H{"data": users[i]})
                return
            }
        }
        c.JSON(404, gin.H{"error": "用户不存在"})
    })

    // 删除用户
    r.DELETE("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        for i, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                users = append(users[:i], users[i+1:]...)
                c.JSON(204, nil)
                return
            }
        }
        c.JSON(404, gin.H{"error": "用户不存在"})
    })

    r.Run(":8080")
}

状态码规范

操作状态码说明
GET 成功200返回资源
POST 成功201创建成功
PUT/PATCH 成功200更新成功
DELETE 成功204无内容返回
资源不存在404Not Found
参数错误400Bad Request
无权限403Forbidden

子资源设计

Go
// 用户文章子资源
r.GET("/users/:id/articles", listUserArticles)
r.GET("/users/:id/articles/:aid", getUserArticle)
r.POST("/users/:id/articles", createUserArticle)

// 简短别名(可选)
r.GET("/articles", listAllArticles)

URL 设计保持简洁一致,避免嵌套层级过多(建议不超过 3 层)。

要点总结

  • URL 使用名词表示资源,HTTP 方法表示操作
  • GET 获取、POST 创建、PUT/PATCH 更新、DELETE 删除
  • 状态码语义明确,200/201/204/404 各有用途
  • 子资源通过 URL 层级表示关系
  • 响应格式统一,便于前端处理

📝 发现内容有误?点击此处直接编辑

← 上一篇 错误处理
下一篇 → 基础路由配置
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库