在 Go 的 Gin Web 框架中,获取 HTTP 请求参数有多种方式

在 Go 的 Gin Web 框架中,获取 HTTP 请求参数有多种方式


1. 路径参数(Path Parameters)

使用 :paramName 在路由中定义,通过 c.Param("paramName") 获取。

go 复制代码
r := gin.Default()
r.GET("/user/:id", func(c *gin.Context) {
    id := c.Param("id")
    c.JSON(200, gin.H{"id": id})
})

请求示例:GET /user/123 → 返回 {"id": "123"}


2. 查询参数(Query Parameters)

URL 中的 ?key=value 形式,使用 c.Query()c.DefaultQuery()

go 复制代码
r.GET("/search", func(c *gin.Context) {
    name := c.Query("name")           // 如果不存在返回空字符串
    age := c.DefaultQuery("age", "0") // 可设置默认值
    c.JSON(200, gin.H{"name": name, "age": age})
})

请求示例:GET /search?name=alice&age=25


3. 表单参数(Form Data)

适用于 POST 请求中的 application/x-www-form-urlencodedmultipart/form-data

go 复制代码
r.POST("/form", func(c *gin.Context) {
    name := c.PostForm("name")
    email := c.DefaultPostForm("email", "unknown@example.com")
    c.JSON(200, gin.H{"name": name, "email": email})
})

4. JSON 请求体

使用 c.ShouldBindJSON() 绑定到结构体(推荐),或用 c.GetRawData() 获取原始数据。

go 复制代码
type User struct {
    Name  string `json:"name" binding:"required"`
    Email string `json:"email" binding:"required,email"`
}

r.POST("/user", func(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, user)
})

请求示例:

json 复制代码
POST /user
Content-Type: application/json

{
  "name": "Bob",
  "email": "bob@example.com"
}

注意:ShouldBindJSON 会自动验证字段(如 binding:"required")。

相关推荐
小二·8 小时前
Python Web 开发进阶实战 :AI 原生数字孪生 —— 在 Flask + Three.js 中构建物理世界实时仿真与优化平台
前端·人工智能·python
Bony-9 小时前
Go语言垃圾回收机制详解与图解
开发语言·后端·golang
Amumu121389 小时前
Vue组件化编程
前端·javascript·vue.js
We་ct10 小时前
LeetCode 6. Z 字形变换:两种解法深度解析与优化
前端·算法·leetcode·typescript
小二·10 小时前
Python Web 开发进阶实战(终章):从单体应用到 AI 原生生态 —— 45 篇技术演进全景与未来开发者生存指南
前端·人工智能·python
m0_6372565811 小时前
vue-baidu-map添加了类型组件导致非常卡顿的问题
前端·javascript·vue.js
挂机且五杀11 小时前
为什么在React地图组件里,memo 不是优化,而是生存?
前端·react.js·前端框架
RFCEO11 小时前
HTML编程 课程七、:HTML5 新增表单标签与属性
前端·html·html5·搜索框·手机号·邮箱验证·日期选择
刘一说11 小时前
Vue开发中的“v-model陷阱”:为什么它不能用于非表单元素?
前端·javascript·vue.js
利刃大大12 小时前
【Vue】组件生命周期 && 组件生命周期钩子
前端·javascript·vue.js·前端框架