乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

    • Golang基础知识

    • Golang进阶知识

    • Golang常用包

    • Gin框架

      • 安装
      • gin路由
      • 请求数据参数绑定
        • 解析 JSON 数据
        • 解析 Form 表单
        • 解析 URL 数据
        • 解析 queryString 数据
      • gin渲染
      • 使用模板渲染
      • 静态文件的使用
      • 数据渲染
      • gin重定向
      • gin同步和异步
      • go中间件
      • 会话保持
      • 文件上传
      • JWT的简单使用
      • 模板函数
      • Swagger
      • API访问控制
      • 常见的应用中间件
      • 应用配置管理
      • 优雅停止与重启
      • 集成Casbin进行访问权限控制
  • AIOps

  • Python

  • DevOps

  • 专栏
  • Golang
  • Gin框架
乔克
2025-07-19
目录

请求数据参数绑定

为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。

在 Go 中,通过反射解析数据都是存放在结构体中,所以我们先定义一个结构体用来接受数据,如下:

type Login struct{
    User string `form:"username" json:"username" xml:"username" binding:"required"`
    Password string `form:"username" json:"username" xml:"username" binding:"required"`
}
1
2
3
4

其中 :

  • form:会去解析 form 表单数据
  • json:会去解析 json 格式数据
  • xml:会去解析 xml 格式数据
  • binding:required 表示设置的参数是必须参数,如果没有传就会报错

# 解析 JSON 数据

package main

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

type Login struct{
	User string `form:"username" json:"username" xml:"username" binding:"required"`
	Password string `form:"password" json:"password" xml:"password" binding:"required"`
}

func main(){
	// 1、创建路由
	g := gin.Default()
	// 2、绑定路由规则
	g.POST("/loginJSON", func(context *gin.Context) {
		var login Login
		// 对参数进行绑定
		if err := context.ShouldBindJSON(&login);err != nil{
			// 如果有错误返回JSON数据
			context.JSON(304,gin.H{"status": err.Error()})
		}
		// 如果没有报错,取值并返回
		context.JSON(200,gin.H{
			"status": http.StatusOK,
			"username": login.User,
			"password": login.Password,
		})
	})
	g.Run(":8000")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

测试看结果:

(1)、正常请求

6dac22c43844670d44d519f3e1084ea8 MD5

(2)、错误请求

b602bc7db05464d8a37f5371bcd5a952 MD5

# 解析 Form 表单

package main

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

type Login struct{
	User string `form:"username" json:"username" xml:"username" binding:"required"`
	Password string `form:"password" json:"password" xml:"password" binding:"required"`
}

func main(){
	// 1、创建路由
	g := gin.Default()
	// 2、绑定路由规则
	g.POST("/loginFORM", func(context *gin.Context) {
		var login Login
		// 对参数进行绑定
		if err := context.ShouldBind(&login);err != nil{
			// 如果有错误返回JSON数据
			context.JSON(304,gin.H{"status": err.Error()})
		}
		// 如果没有报错,取值并返回
		context.JSON(200,gin.H{
			"status": http.StatusOK,
			"username": login.User,
			"password": login.Password,
		})
	})
	g.Run(":8000")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

135af2f9d6b660e49f63ae1cc1dd33fc MD5

# 解析 URL 数据

package main

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

type Login struct{
	User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
	Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
}

func main(){
	// 1、创建路由
	g := gin.Default()
	// 2、绑定路由规则
	g.GET("/:username/:password", func(context *gin.Context) {
		var login Login
		// 对参数进行绑定
		if err := context.ShouldBindUri(&login);err != nil{
			// 如果有错误返回JSON数据
			context.JSON(304,gin.H{"status": err.Error()})
		}
		// 如果没有报错,取值并返回
		context.JSON(200,gin.H{
			"status": http.StatusOK,
			"username": login.User,
			"password": login.Password,
		})
	})
	g.Run(":8000")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

15d8cd4459f8385c0efe88ed372e332b MD5

# 解析 queryString 数据

package main

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

type Login struct{
	User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
	Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
}

func main(){
	// 1、创建路由
	g := gin.Default()
	// 2、绑定路由规则
	g.GET("/login", func(context *gin.Context) {
		var login Login
		// 对参数进行绑定
		if err := context.ShouldBind(&login);err != nil{
			// 如果有错误返回JSON数据
			context.JSON(304,gin.H{"status": err.Error()})
		}
		// 如果没有报错,取值并返回
		context.JSON(200,gin.H{
			"status": http.StatusOK,
			"username": login.User,
			"password": login.Password,
		})
	})
	g.Run(":8000")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

aeece4a284b9e09e80a6bb677e9e46b2 MD5

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 09:17:41
gin路由
gin渲染

← gin路由 gin渲染→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式