Gin各种参数接收

这篇具有很好参考价值的文章主要介绍了Gin各种参数接收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Gin参数接收

1.各个参数的接收方法

  • 声明: 这里的c都是c *gin.Context中的c

Gin中发送JSON数据

  • 在传输或接受JSON数据时,通常习惯通过创建结构体的方式存储数据

  • 注意点:

      1. 结构体中成员名需要大写字母开头,否则无法访问
      2. 需要再成员名后添加tag标签 ,方便传输以及接收数据
  • 方法

    func (c *Context) JSON(code int, obj any) {
       
    }
    
    • code是状态码,例如:http.StatusOK这是go语言内置变量
    • obj指需要传入的数据
  • 代码案例:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"log"
    	"net/http"
    )
    
    // User 构建数据结构(存储json数据
    // 注意:1.需要大写字母开头否则无法访问
    // 注意:2.`json`是tag标签,这样方便定义前端显示名称
    type User struct {
    	Name   string `json:"name"`
    	Gender string `json:"gender"`
    	Age    int    `json:"age"`
    }
    
    func main() {
    	//启动服务器
    	r := gin.Default()
    
    	//发起请求
    	r.GET("/Json", func(c *gin.Context) {
    		data := &User{
    			Name:   "贤哥",
    			Gender: "男",
    			Age:    18,
    		}
    		c.JSON(http.StatusOK, gin.H{
    			"data": data,
    		})
    	})
    
    	//运行服务器
    	err := r.Run(":9000")
    	if err != nil {
    		log.Println("启动错误:", err)
    	}
    }
    
    
    • 传数据习惯用gin中的gin.H{}

Gin接收querystring数据

  • 介绍:

    • //querystring 数据是在URl上的参数,例如:https://www.bing.com/search?q=邓超
      //这里的"q = 邓超"就是querystring,其中q是变量,邓超是值
      
  • 方法:

    • c.Query(key):根据变量名接收值
    • c.DefaultQuery(key,defaultValue):根据变量名接收值,如果没有该变量,就输出定义好的值
    • c.GETQuery(key):返回值有两个,一个是接收到的值,一个是布尔值,可以通过判断布尔值查看是否接受到值
  • 代码案例

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"log"
    	"net/http"
    )
    
    //querystring 数据是在URl上的参数,例如:https://www.bing.com/search?q=邓超
    //这里的"q = 邓超"就是querystring,其中q是变量,邓超是值
    
    type User struct {
    	Name string `json:"name"`
    	Age  string `json:"age"`
    }
    
    func main() {
    	//创建Gin变量
    	r := gin.Default()
    
    	//发起请求
    	r.GET("/query", func(c *gin.Context) {
    		//单纯接收querystring的值
    		data1 := c.Query("query")
    
    		//接收querystring,如果没有接收到值就,输出定义好的值(类似这里的nothing)
    		data2 := c.DefaultQuery("query", "nothing")
    
    		//获取querystring的值,返回当前值和bool值,如何bool为false,默认返回空值
    		data3, ok := c.GetQuery("query")
    		if !ok {
    			data3 = "nothing"
    		}
    
    		//可以将querystring的值,解析到结构体中存储
    		//注意:结构体的成员名和querystring的变量名必须一致,否则解析不到
    		var user User
    		err := c.BindQuery(&user)
    		if err != nil {
    			log.Println(err)
    			return
    		}
    
    		//可以用于相同变量却有多个值的情况接收变量,接收后的变量会被保存在切片中
    		//query=尼玛&query=tm 输出 "query4":["尼玛","tm"]
    		data4 := c.QueryArray("query")
    
    		//通过Json数据发出
    		c.JSON(http.StatusOK, gin.H{
    			"query1": data1,
    			"query2": data2,
    			"query3": data3,
    			"query4": data4,
    			"user":   user,
    		})
    	})
    
    	//启动服务器
    	err := r.Run(":9000")
    	if err != nil {
    		log.Println("启动失败:", err)
    	}
    }
    
    

Gin接收Form的参数

  • 结论: 方法的用法和querystring的基本一致

  • 代码:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"log"
    	"net/http"
    )
    
    //任务:接收form的数据
    //1.创建form表单
    //2.解析数据
    
    func main() {
    	r := gin.Default()
    
    	//解析模板
    	r.LoadHTMLFiles("./login.html", "./index.html")
    
    	//渲染模板(渲染登录页面
    	r.GET("/login", func(c *gin.Context) {
    		c.HTML(http.StatusOK, "login.html", nil)
    	})
    
    	//点击form的登录按钮提交数据后会发起method方法的请求
    	//所以得写一个post方法以及,输出数据到post渲染的网页
    	r.POST("/login", func(c *gin.Context) {
    		//单个接收表单数据
    		//username := c.PostForm("username")
    		password := c.PostForm("password")
    
    		//单个接收表单的数据,如果没有参数就输出notDefault
    		//username := c.DefaultPostForm("username", "notDefault")
    
    		//以数组的方式接收值
    		username := c.PostFormArray("username")
    
    		//password, ok := c.GetPostForm("username")
    
    		c.HTML(http.StatusOK, "index.html", gin.H{
    			"username": username[0],
    			"password": password,
    		})
    		//总结接收表单数据的各种函数基本和接收querystring参数的用法一致
    	})
    	//启动服务器
    	err := r.Run(":9000")
    	if err != nil {
    		log.Println(err)
    		return
    	}
    }
    
    

Gin接收URI参数

  • 介绍

    • //了解什么是URI参数
      //例如一条URL为http://ouzhenxian.com/blog/2023/1
      //这里的URL中,可以指定2023和1为参数(是否是参数是由你的接收格式决定的
      //格式: "/blog/:year/:mouth",":"后面的参数就是需要被接收的数据
      
  • c.Param方法和querystring用法基本一致

  • 代码:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    func main() {
    	r := gin.Default()
    
    	r.GET("/blog/:year/:mouth", func(c *gin.Context) {
    		year := c.Param("year")
    		mouth := c.Param("mouth")
    
    		c.JSON(http.StatusOK, gin.H{
    			"year":  year,
    			"mouth": mouth,
    		})
    	})
    
    	//启动服务器
    	err := r.Run(":9000")
    	if err != nil {
    		return
    	}
    }
    

2.参数绑定方式接收(更加方便)

  • 核心方法c.ShouldBind()

  • 优点: 相比前面的更加快捷高效

  • 代码展示

    package main
    
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"log"
    	"net/http"
    )
    
    //任务: 利用ShouldBind()函数绑定参数
    
    type UserInfo struct {
    	Username string `json:"username"  form:"username" uri:"username" query:"username"` //注意2点: 字段名需要大写,需要写tag,否则找不到
    	Password string `json:"password"  form:"password" uri:"password" query:"password"`
    }
    
    func main() {
    	r := gin.Default()
    
    	//发出请求
    	r.GET("/json", func(c *gin.Context) {
    		var user UserInfo
    		err := c.ShouldBindJSON(&user) //注意:这里需要写&,否则是值传递,无法修改值
    		if err != nil {
    			log.Println(err)
    			return
    		}
    		//处理数据
    		fmt.Printf("%#v\n", user) //一起输出
    		c.JSON(http.StatusOK, gin.H{
    			"status": "ok",
    		})
    	})
    
    	r.GET("/query", func(c *gin.Context) {
    		var user UserInfo
    		err := c.ShouldBindQuery(&user) //注意:这里需要写&,否则是值传递,无法修改值
    		if err != nil {
    			log.Println(err)
    			return
    		}
    		//处理数据
    		fmt.Printf("%#v\n", user) //一起输出
    		c.JSON(http.StatusOK, gin.H{
    			"status": "ok",
    		})
    	})
    
    	r.POST("/form", func(c *gin.Context) {
    		var user UserInfo
    		err := c.ShouldBind(&user) //注意:这里需要写&,否则是值传递,无法修改
    		if err != nil {
    			log.Println(err)
    			return
    		}
    		//处理数据
    		fmt.Printf("%#v\n", user) //一起输出
    		c.JSON(http.StatusOK, gin.H{
    			"status": "ok",
    		})
    	})
    
    	r.GET("/uri/:username/:password", func(c *gin.Context) {
    		var user UserInfo
    		err := c.ShouldBindUri(&user) //注意:这里需要写&,否则是值传递,无法修改值
    		if err != nil {
    			log.Println(err)
    			return
    		}
    		//处理数据
    		fmt.Printf("%#v\n", user) //一起输出
    		c.JSON(http.StatusOK, gin.H{
    			"status": "ok",
    		})
    	})
    
    	//启动服务器
    	err := r.Run(":8080")
    	if err != nil {
    		log.Println(err)
    		return
    	}
    
    }
    
  • 注意点:

    • 1.结构体成员名首字母大写
    • 2.需要指定tag
    • 3.ShouldBind()接受的值必须是地址值(例如:&user)
  • 说明: Gin框架中不是每个数据格式都有对应的ShouldBind函数文章来源地址https://www.toymoban.com/news/detail-648080.html

    • 例如:这里的JSON数据有—>c.ShouldBindJSON(&user),而这里的表单Form数据没有对应的和函数,那就使用通用的c.ShouldBind(&user)

推荐一款软件

  • Postman软件: 在做网络开发过程中可以非常方便的传输数据测试,有兴趣的可以自行查看,该软件需要科学

到了这里,关于Gin各种参数接收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go gin 参数绑定常用验证器

    https://pkg.go.dev/github.com/go-playground/validator/v10#readme-baked-in-validations min 最小 max 最大 len 长度限制 gt 大于 eq 等于 ne 不等于 eqfield 与某个字段值一样 nefield 与某个字段值不一样 oneof 枚举 ,以空格分开 startswith endswith dive 数组

    2024年02月11日
    浏览(39)
  • Go的gin参数校验之validator库

    使用 validator 以后,只需要在定义结构体时使用 binding 或 validate tag标识相关校验规则,就可以进行参数校验了,而不用自己单独去写常见的校验规则。 常用约束如下: 字符串约束 excludesall:不包含参数中任意的 UNICODE 字符,例如excludesall=ab; excludesrune:不包含参数表示的

    2024年02月12日
    浏览(40)
  • 【go】GIN参数重复绑定报错EOF问题

    在 Gin 框架中,当多次调用 ShouldBind() 或 ShouldBindJSON() 方法时,会导致请求体的数据流被读取多次,从而出现 “EOF” 错误。 例如在api层绑定了参数,又自定义了读取参数或绑定参数的中间件,会造成重复调用。 [ERROR] 2023/08/07 14:36:48 {“user_id”:“975674f531784289bfba3ee011ec0af0”,“

    2024年02月14日
    浏览(44)
  • Go学习第十五章——Gin参数绑定bind与验证器

    在Gin框架中, bind 用于绑定参数,即将请求参数绑定到结构体中。通过使用 bind ,我们可以方便地将请求参数与结构体字段进行绑定,从而更方便地处理和验证参数。 Gin框架提供了多种绑定方法,包括Query参数绑定、Form参数绑定、JSON参数绑定等。下面分别介绍这些方法的详

    2024年02月07日
    浏览(42)
  • Gin框架: 使用go-ini配置参数与不同环境下的配置部署

    关于 INI 配置文件与go-ini 1 )概述 在INI配置文件中可以处理各种数据的配置 INI文件是一种简单的文本格式,常用于配置软件的各种参数 go-ini 是地表 最强大、最方便 和 最流行 的 Go 语言 INI 文件操作库 Github 地址:https://github.com/go-ini/ini 官方文档: https://ini.unknwon.io/ 使用示例

    2024年02月22日
    浏览(46)
  • Go语言项目后端使用gin框架接收前端发送的三种格式数据(form-data,json,Params)

    使用gin框架的BindJSON方法,将前端的json格式数据将后端的结构体相绑定,从而获取到前端所发送的数据,并返回给前端 1.将前端发送过来的数据全部返回 2.将前端发送过来的json格式数据选择性返回   使用gin框架的PostForm方法,从而获取到前端form格式的参数 使用gin框架中的

    2024年02月01日
    浏览(115)
  • golang微框架Gin

    Gin是一个golang的微框架,基于httprouter,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 Gin特征 速度快:基于基数树的路由,内存占用小,没有反射,可预测的APi性能 中间件支持 传入的http请求可以有中间件链和最终操作处理,例如:Logger,Aut

    2024年02月09日
    浏览(43)
  • [golang gin框架] 39.Gin商城项目-微服务实战之微服务架构

    单体架构在 中小企业内部 用的是非常多的,当 业务不复杂 , 团队规模不大 的时候,单体架构比微服务架构具有 更高的生产率 单体架构 当 业务比较复杂 , 并发量 比较大, 团队规模扩大的时候, 就需要引入微服务架构了,它比单体架构 具有 更高的生产率, 可以 节省成本 , 解

    2024年02月12日
    浏览(43)
  • golang Gin实现websocket

    golang使用 Gin实现 websocket,这里笔者重新搭建一个项目 项目名为 go-gin-websocket 在指定文件夹下,新建项目文件夹 go-gin-websocket 进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket)文件夹路径下,执行初始化命令 go mod init go-gin-websocket 安装依赖 安装gin  安装websocket 在项

    2024年02月06日
    浏览(49)
  • 解决GO安装gin框架(go get -u github.com/gin-gonic/gin)超时问题

    🍊gin框架github地址:https://github.com/gin-gonic/gin         按照官方文档安装gin,但是尝试了好几次,包括使用国内网络或者使用梯子,都超时失败了,爆了如下超时错误 🍊 解决方法如下 1、先查看go相关的配置 如上显示GOPROXY配置是https://proxy.golang.org,这个地址已经被墙了,

    2024年02月11日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包