前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Gin 学习之绑定参数

Gin 学习之绑定参数

作者头像
frank.
发布于 2020-08-31 14:07:38
发布于 2020-08-31 14:07:38
11.7K00
代码可运行
举报
运行总次数:0
代码可运行

01

概念

要将请求体绑定到结构体中,需要使用模型绑定。Gin 目前支持JSONXML、YAML和标准表单值的绑定(foo=bar&boo=baz)。

使用时,结构体字段首字母必须大写。需要在要绑定的所有字段上,设置相应的tag。例如,使用 JSON 绑定时,设置字段标签为 json:"fieldname"。你也可以指定必须绑定的字段。如果一个字段的 tag 加上了 binding:"required",但绑定时是空值, Gin 会报错。Gin 使用 go-playground/validator.v8 进行验证。

Gin 提供了两类绑定方法:Must bind 和 Should bind。

Must bind 的方法有 Bind,BindJSON,BindXML,BindQuery,BindYAML,这些方法属于 BindWith 的具体调用。

Must bind 如果发生绑定错误,则请求终止,并触发 c.AbortWithError(400, err).SetType(ErrorTypeBind)。响应状态码被设置为 400 并且 Content-Type 被设置为 text/plain; charset=utf-8。如果您在此之后尝试设置响应状态码,Gin会输出日志 [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422。

Should bind的方法有 ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML,这些方法属于 ShouldBindWith 的具体调用。

Should bind 如果发生绑定错误,Gin 会返回错误并由开发者处理错误和请求。

使用 Bind 方法时,Gin 会尝试根据 Content-Type 推断如何绑定。如果你明确知道要绑定什么,可以使用 MustBindWith 或 ShouldBindWith。

如果您希望更好地控制绑定,考虑使用 ShouldBind 等效方法。如果对 Must bind 的方法感兴趣,可以查阅文档或阅读 Gin 源码,本文我们主要介绍 Should bind 的方法。

本文示例代码需要使用到的自定义结构体类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type user struct {  Name string `form:"username" json:"username" xml:"username" uri:"username"`  Age  int    `form:"age" json:"age" xml:"age" uri:"age"`}
type student struct {  UserInfo user `form:"userinfo"`  Score    int  `form:"score" json:"score" xml:"score" uri:"score"`}

02

ShouldBind

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBind(obj interface{}) error

ShouldBind 支持绑定 urlencoded form 和 multipart form。

如果是 `GET` 请求,只使用 `Form` 绑定引擎(`query`)。

如果是 `POST` 请求,首先检查 `content-type` 是否为 `JSON` 或 `XML`,然后再使用 `Form`(`form-data`)。

绑定到结构体

绑定到嵌套结构体

03

ShouldBindJSON

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindJSON(obj interface{}) error

ShouldBindJSON 是 for c.ShouldBindWith(obj, binding.JSON) 的简写方式。

示例代码:

04

ShouldBindXML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindXML(obj interface{}) error

ShouldBindXML 是 c.ShouldBindWith(obj, binding.XML) 的简写方式。

示例代码:

05

ShouldBindQuery

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindQuery(obj interface{}) error

ShouldBindQuery 是 c.ShouldBindWith(obj, binding.Query) 的简写方式。

ShouldBindQuery 如果 url 查询参数和 post 数据都存在,函数只绑定 url 查询参数而忽略 post 数据。

示例代码:

06

ShouldBindYAML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindYAML(obj interface{}) error

ShouldBindYAML 是 c.ShouldBindWith(obj, binding.YAML) 的简写方式。

示例代码:

07

ShouldBindWith

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindWith(obj interface{}, b binding.Binding) error

ShouldBindWith 使用指定的绑定引擎,绑定传递过来的结构体指针。

示例代码:

08

ShouldBindUri

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (*gin.Context).ShouldBindUri(obj interface{}) error

ShouldBindUri binds the passed struct pointer using the specified binding engine.

示例代码:


推荐阅读:

Gin 学习之安装和快速启动

Gin 学习之响应处理

Gin 学习之 HTTP 请求方法

Gin 学习之接收参数和读取 reader

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了。
KevinYan
2023/01/03
3.3K0
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
「Go框架」bind函数:gin框架中是如何将请求数据映射到结构体的?
在gin框架中,我们知道用bind函数(或bindXXX函数)能够将请求体中的参数绑定到对应的结构体上。同时,你也会发现在gin中有很多bind或bindXXX函数,比如ShouldBind、ShouldBindQuery、ShouldBindHeader、ShouldBindJSON等等。那么,他们之间有什么不同呢?本文带你深入了解这些bind函数的使用。
Go学堂
2023/08/28
8250
「Go框架」bind函数:gin框架中是如何将请求数据映射到结构体的?
gin中validator模块的源码分析
众所周知,在api层需要使用gin.Context中的ShouldBindJSON方法来对request中的json字段进行校验,例子如下:
编程黑洞
2023/03/06
4200
Gin 框架怎么验证绑定到结构体的字段?
在使用 Gin 框架开发项目时,通常我们选择模型绑定的方式接收请求参数,我们在上一遍文章中,已经介绍过使用 Gin 框架接收请求参数的常用方式。
frank.
2024/11/19
1220
Gin 框架怎么验证绑定到结构体的字段?
gin 源码阅读(4) - 友好的请求参数处理
通过 gin 的路由,已经把请求分配到具体的函数里面里面了,下面就要开始处理具体的业务逻辑了。
haohongfan
2021/10/20
1.1K0
Gin框架源码解析【建议收藏】
Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习。gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了。我们可以追着代码思考下,这个框架是如何一步一步过来的。
码农编程进阶笔记
2021/12/15
2.4K0
Gin框架源码解析【建议收藏】
深入Gin框架内幕(二) 顶
在开始分析之前,我们先简单回顾一下上一个章节中讲到的Gin框架中的几个核心的结构.
BGBiao
2020/02/13
1.5K0
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.4K0
Gin-Web-Framework官方指南中文(下篇)
go : gin 模型绑定与验证
将请求体绑定到类型中,请使用模型绑定。我们目前支持JSON、XML、YAML和标准表单值(foo=bar&boo=baz)的绑定
IT工作者
2022/07/23
3110
ginbind 的实现过程-一起来看gin源码吧
如果你用过 gin 那么你一定知道,gin 中绑定参数的方式很零散。 c *gon.Context 给你提供了很多中方法, 例如BindHeader, BindURI 等等, 但是如果想要绑定 reqeust 中不同地方的参数, 那对不起咯,并没有。
老麦
2022/12/24
4410
ginbind 的实现过程-一起来看gin源码吧
6.Gin 路由详解 - GET POST 请求以及参数获取示例
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制自动提取请求中 QueryString、form 表单、JSON、XML 等参数到结构体中。
Devops海洋的渔夫
2023/11/20
2.3K0
6.Gin 路由详解 - GET POST 请求以及参数获取示例
Go高级之Gin框架中POST参数的提取(二)
POST请求是一种HTTP请求方法,常用于用于向指定的资源提交要被处理的数据。与GET请求不同,POST请求将数据包含在请求的消息体(body)中,而不是在URL的查询参数中。通过POST请求,可以向服务器发送数据,这些数据可以是表单数据、JSON数据、文件等。
言志志
2023/11/05
1.4K0
Go高级之Gin框架中POST参数的提取(二)
Go: Gin框架中的binding验证器使用指南
在Gin框架中,数据绑定和验证是开发API时不可或缺的部分。Gin提供了强大的binding功能,允许我们将请求的数据绑定到结构体,并通过标签进行数据验证。本文将详细讲解如何在Gin中使用binding验证器进行数据验证,并提供代码示例帮助理解。
运维开发王义杰
2024/05/31
1.3K0
Go: Gin框架中的binding验证器使用指南
Gin 路由注册与请求参数获取
RESTful(Representational State Transfer)代表的是一种基于HTTP协议设计的软件架构风格,它通常用于构建Web服务,是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。RESTful架构的设计理念是将资源表示为URI(统一资源标识符),通过HTTP协议的GET、POST、PUT、DELETE等方法对资源进行操作。以下是RESTful架构的一些关键特点:
贾维斯Echo
2024/01/05
4440
Gin 路由注册与请求参数获取
Gin 11
使用 model binding 来将请求中的数据绑定到一个 model 中,形成一个结构体,Gin 目前支持绑定 JSON XML 和标准的表单数据 (foo=bar&boo=baz)
franket
2021/08/10
4780
02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
json,结构体,xml, yaml类似于java的properties,protobuf
iginkgo18
2020/11/04
1.5K0
02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
Gin框架系列04:趣谈参数绑定与校验
在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验。
平也
2020/04/12
2.6K0
轻量级 Web 框架 Gin 结构分析
Go 语言最流行了两个轻量级 Web 框架分别是 Gin 和 Echo,这两个框架大同小异,都是插件式轻量级框架,背后都有一个开源小生态来提供各式各样的小插件,这两个框架的性能也都非常好,裸测起来跑的飞快。本节我们只讲 Gin 的实现原理和使用方法,Gin 起步比 Echo 要早,市场占有率要高一些,生态也丰富一些。
老钱
2019/03/18
4.2K0
轻量级 Web 框架 Gin 结构分析
gin学习笔记
首先我们使用 go moudle来管理依赖, go版本要求在 1.11.1 及以上
用户2825413
2020/02/20
8120
初学gin
已经放弃goframe框架,对待新手不是很友好,社区圈子也很小。因为我自身的话是没有go语言的编程基础的,所以导致了我看不太懂那个框架,不过看很多人都说goframe封装的很好,有人吐槽有人夸,开源的框架嘛,这些都是在所难免的。
是小张啊喂
2021/08/09
7770
相关推荐
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验