【Golang学习之旅】使用 Gin 构建 RESTful API

前言

✅ 适合人群:Go 后端开发者 | Web API 开发者 | 想快速掌握 Gin 框架的工程师
✅ 文章亮点:从零开始,详细解析 Gin 的核心功能,并通过 实战代码 构建 RESTful API
✅ 目标:掌握 Gin 框架,实现高效、可扩展的 RESTful API!

1. 为什么选择 Gin?

Gin 是 Go 语言中最受欢迎的 Web 框架之一,专为高性能 Web API 设计。相比于 net/http,Gin 具有以下优势:

✅ 极高的性能:基于 httprouter,比 net/http 快 40 倍
✅ 简洁的 API设计:类似 Express.js,API 设计直观
✅ 内置中间件:支持日志、恢复、CORS 等功能
✅ 支持 JSON 解析、参数绑定:简化数据处理
✅ 支持路由分组:更易于组织项目

2. 安装 Gin 并创建项目

2.1 安装 Gin

go get -u github.com/gin-gonic/gin

📌 确保你的 Go 版本 >= 1.16,并已开启 go mod

2.2 创建 main.go 并编写 Hello World

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
	r := gin.Default()  // 创建Gin引擎(默认带Logger和Recovery中间件)
	r.GET("/hello", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"message": "成功获取数据!"})
	})
	r.Run(":8080")  // 启动服务器,监听 8080 端口
}

📌 运行代码:

go run main.go

📌 测试 API:
在这里插入图片描述

3. Gin 基础功能详解

3.1 请求参数解析

Gin 提供多种方式解析客户端请求参数,包括:
🔹 1)URL 查询参数(Query)

r.GET("/query", func(ctx *gin.Context) {
		name := ctx.DefaultQuery("name", "Guest") // 默认值 Guest
		age := ctx.Query("age")                   // 没传值默认返回空字符串
		ctx.JSON(http.StatusOK, gin.H{"name": name, "gae": age})
})

📌 测试:
在这里插入图片描述
🔹 2)URL 路径参数(Path Param)

r.GET("/user/:id", func(ctx *gin.Context) {
		id := ctx.Param("id") // 获取路径参数
		ctx.JSON(http.StatusOK, gin.H{"user_id": id})
})

📌 测试:
在这里插入图片描述
🔹 3)POST 表单参数(Form Data)

	r.POST("/form",func(ctx *gin.Context) {
		username := ctx.PostForm("username")
		password := ctx.PostForm("password")
		ctx.JSON(http.StatusOK, gin.H{
			"username":username,
			"password":password,
		})
	})

📌 测试:
在这里插入图片描述
🔹 4)JSON 解析

type User struct {
	Name  string `json:"name" binding:"required"`
	Email string `json:"email"`
}

	r.POST("/json", func(ctx *gin.Context) {
		var user User
		if err := ctx.ShouldBindJSON(&user); err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		ctx.JSON(http.StatusOK, gin.H{"message": "User recevied", "user": user})
	})

📌 测试:
在这里插入图片描述

4. Gin 路由与中间件

4.1 路由分组

api := r.Group("/api")
	{
		api.GET("/users",getUsers)
		api.POST("/users",createUser)
	}

4.2 自定义中间件

func AuthMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		token := ctx.GetHeader("Authorization")
		if token != "valid-token" {
			ctx.JSON(http.StatusUnauthorized,gin.H{
				"error":"Unauthorized",
			})
			ctx.Abort()
			return
		}
		ctx.Next()
	}
}
// 初始化 Gin 引擎
	r := gin.New()

	r.GET("/secure",AuthMiddleware(),func(ctx *gin.Context) {
		ctx.JSON(http.StatusOK,gin.H{"message":"Authorized"})
	})

5. 构建完整 RESTful API

5.1 定义 User 结构体

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}
var users = []User{{ID: 1, Name: "Alice"}, {ID: 2, Name: "Bob"}}

5.2 实现 CRUD 操作

// 获取所有用户
r.GET("/users", func(c *gin.Context) {
    c.JSON(http.StatusOK, users)
})

// 获取单个用户
r.GET("/users/:id", func(c *gin.Context) {
    id, _ := strconv.Atoi(c.Param("id"))
    for _, user := range users {
        if user.ID == id {
            c.JSON(http.StatusOK, user)
            return
        }
    }
    c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
})

// 创建用户
r.POST("/users", func(c *gin.Context) {
    var newUser User
    if err := c.ShouldBindJSON(&newUser); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    newUser.ID = len(users) + 1
    users = append(users, newUser)
    c.JSON(http.StatusCreated, newUser)
})

🎯 总结

✅ 学习了 Gin 的核心功能: 请求解析、JSON 绑定、路由分组、中间件
✅ 实现了一个完整的 RESTful API,包括 GET、POST、CRUD 操作
✅ Gin 的高性能 + 简洁 API,使其成为 Go Web 开发的首选框架!

🔥 互动交流 & 领取学习资料

📌 完整代码 + Golang 进阶学习路线,已整理到我的 CSDN 博客,关注后私信【Gin学习】获取!
📌 如果觉得文章有帮助,记得点赞 👍 + 收藏 ⭐ + 关注 🔥!这样下次找不到别怪我没提醒哦! 🚀🚀🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员林北北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值