前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Gin 框架怎么实现验证请求参数和返回响应数据的函数?

Gin 框架怎么实现验证请求参数和返回响应数据的函数?

作者头像
frank.
发布于 2024-12-19 08:36:27
发布于 2024-12-19 08:36:27
21600
代码可运行
举报
运行总次数:0
代码可运行

01 、介绍

在使用 Gin 框架开发时,入口函数通常需要支持验证请求参数和返回响应数据。

我们可以将验证请求参数和返回响应数据整合为一个通用函数。

然后,结合响应数据返回中间件,实现通过一个函数,实现验证请求参数和返回响应数据 的功能。

02 、请求参数验证和返回响应数据

首先,我们需要定义一个自定义结构体类型 Response,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Response struct {
 Code int                    `json:"code"`
 Msg  string                 `json:"msg"`
 Data map[string]interface{} `json:"data"`
}

阅读上面这段代码,我们定义一个自定义结构体类型 Response,该结构体类型包含 3 个字段,分别是 CodeMsgData,并且分别定义了 json 标签。

需要注意的是,字段 Data 使用的变量类型是 map[string]interface{},映射的 value 使用 interface{} 变量类型,可以支持任意类型的响应数据。

此外,我们还可以根据项目需求,添加其它字段,比如 TraceIdError 等。

返回响应数据

接下来,我们创建一个返回响应数据的函数,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func GetData(c *gin.Context) (data *Response) {
 value, exists := c.Get("data")
 if !exists {
  data = &Response{
   Code: http.StatusOK,
  }
  data.Data = make(map[string]interface{})
  c.Set("data", data)
  return
 }
 if data, exists = value.(*Response); !exists {
  data = &Response{Code: http.StatusInternalServerError}
  return
 }
 return
}

阅读上面这段代码,我们使用 Gin 框架的 gin.Context 的存储数据,通过 SetGet 方法,设置和获取数据。

需要注意的是,使用 gin.Context 存储的数据是 interface{} 类型,所以,在我们使用该数据时,需要先通过断言,检查该数据的类型是否合法。

请求参数验证

接下来,我们创建一个验证请求参数和返回响应数据的函数 ValidatorAndReturn,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func ValidatorAndReturn(c *gin.Context, arg interface{}) (data *Response, err error) {
 data = GetData(c)
 err = c.ShouldBind(arg)
 if err != nil {
  return
 }
 return
}

阅读上面这段代码,我们定义一个函数,接收参数是 *gin.Context 类型的变量 c,和 interface{} 类型的变量 arg,返回结果是 *Response 类型的 data 和 error 类型的 err。

函数体中,包含自定义函数 GetDataShouldBind 方法。读者朋友们,可以根据自己的项目,优化验证请求参数的代码。

需要注意的是,严格意义上讲,此处 GetData 函数并未提供 Gin 框架入口函数自动返回响应数据的功能。我们需要通过中间件实现该功能。

03 、响应数据返回中间件

最后,我们需要创建一个中间件函数 ResponseReturn,使 Gin 框架的入口函数自动返回响应数据。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ResponseReturn middleware
func ResponseReturn() gin.HandlerFunc {
 return func(c *gin.Context) {
  data := GetData(c)
  c.Render(http.StatusOK, ReturnJson{Data: data})
 }
}

阅读上面这段代码,我们定义一个中间件函数 ResponseReturn,使用 gin.ContextRender 方法,返回响应数据。

需要注意的是 Render 的第二个参数是 render.Render 类型。

源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Render interface {
    Render(http.ResponseWriter) error
    WriteContentType(w http.ResponseWriter)
}

阅读 Gin 框架源码,我们可以发现 render.Render 是一个接口类型,包含两个方法,分别是 RenderWriteContentType

所以,我们定义了一个结构体 ReturnJson,并实现 render.Render 的两个方法,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var contentType = []string{"application/json; charset=utf-8"}

type ReturnJson struct {
 Data interface{}
}

func responseContentType(w http.ResponseWriter, contentType []string) {
 header := w.Header()
 if val := header["Content-Type"]; len(val) == 0 {
  header["Content-Type"] = contentType
 }
}

func ResponseJson(w http.ResponseWriter, data interface{}) (err error) {
 responseContentType(w, contentType)
 bf := bytes.NewBuffer([]byte{})
 jsonEncoder := json.NewEncoder(bf)
 jsonEncoder.SetEscapeHTML(false)
 err = jsonEncoder.Encode(data)
 if err != nil {
  return
 }
 _, err = w.Write(bf.Bytes())
 if err != nil {
  return
 }
 return
}

func (r ReturnJson) Render(w http.ResponseWriter) (err error) {
 err = ResponseJson(w, r.Data)
 if err != nil {
  return
 }
 return
}

func (r ReturnJson) WriteContentType(w http.ResponseWriter) {
 responseContentType(w, contentType)
}

阅读上面这段代码,我们定义结构体类型的自定义类型 ReturnJson,并创建两个方法 RenderWriteContentType,从而实现接口类型 render.Render,作为 c.Render 的参数。

04 、总结

本文我们介绍 Gin 框架怎么实现验证请求参数和返回响应数据的函数。

我们通过三个步骤完成,第一,创建返回响应数据的函数;第二,创建验证请求参数和返回响应数据的整合函数;第三,创建返回响应数据的中间件函数。

本文所用到的代码,我们在之前的文章中都介绍过,读者朋友们如果有不明白的代码,可以翻阅之前的文章。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
gin 源码阅读(5) - 灵活的返回值处理
上一篇文章是关于如何快速解析客户端传递过来的参数的,参数解析出来后就开始了我们的业务的开发流程了。
haohongfan
2021/10/22
1.6K0
Gin框架详解
gin是一个开源的,用golang开发的web框架,https://github.com/gin-gonic/gin 地址如下。它有如下特性:
榴莲其实还可以
2019/07/19
7.4K0
深入Gin框架内幕(二) 顶
在开始分析之前,我们先简单回顾一下上一个章节中讲到的Gin框架中的几个核心的结构.
BGBiao
2020/02/13
1.5K0
Go:web框架 Gin 简介与实践
gin是用go语言开发的一个web框架,简单易用,是一个轻量级框架。Gin是Golang的一个web框架,封装优雅API友好,源码注释比较明确。借助Gin框架开发web服务,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。
Freedom123
2024/03/29
8370
Go:web框架 Gin 简介与实践
轻量级 Web 框架 Gin 结构分析
Go 语言最流行了两个轻量级 Web 框架分别是 Gin 和 Echo,这两个框架大同小异,都是插件式轻量级框架,背后都有一个开源小生态来提供各式各样的小插件,这两个框架的性能也都非常好,裸测起来跑的飞快。本节我们只讲 Gin 的实现原理和使用方法,Gin 起步比 Echo 要早,市场占有率要高一些,生态也丰富一些。
老钱
2019/03/18
4.3K0
轻量级 Web 框架 Gin 结构分析
gin框架上手实践
Gin框架是一个用Go语言编写的高性能Web框架,以其速度和简洁性著称。它由一个轻量级的HTTP路由器和一个中间件架构组成,能够处理大型流量并简化开发者的工作。Gin的主要特点包括内置的路由组、简洁的API设计、强大的错误处理机制、支持多种格式的请求绑定和验证,以及内置的日志记录功能。由于其性能优越和易于使用,Gin广泛应用于构建RESTful API和Web服务。其设计理念是尽可能减少繁琐的配置和代码,让开发者专注于业务逻辑,实现快速开发和部署。
FunTester
2024/07/30
1700
gin框架上手实践
Go语言学习 - RPC篇:gin框架的基础能力剖析
gin是非常流行的一款HTTP框架。相较于原生的HTTP server,gin有很多改进点,主要在于3点:
junedayday
2022/12/02
1.5K0
Go语言学习 - RPC篇:gin框架的基础能力剖析
Gin框架源码解析【建议收藏】
Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习。gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了。我们可以追着代码思考下,这个框架是如何一步一步过来的。
码农编程进阶笔记
2021/12/15
2.4K0
Gin框架源码解析【建议收藏】
从零实现Web框架Geo教程-上下文-02
我们将和路由相关的方法和结构提取了出来,放到了一个新的文件中router.go,方便我们下一次对 router 的功能进行增强,例如提供动态路由的支持。 router 的 handle 方法作了一个细微的调整,即 handler 的参数,变成了 Context。
大忽悠爱学习
2022/09/26
3630
【云+社区年度征文】深入浅出 Gin 生命周期
Gin 是一个用 Go (Golang) 编写的 web 框架,由于出色的性能优势而被广泛使用,这里我们就来分析下 Gin 的请求生命周期
柳公子
2020/12/15
1.3K0
【云+社区年度征文】深入浅出 Gin 生命周期
gin 源码阅读(4) - 友好的请求参数处理
通过 gin 的路由,已经把请求分配到具体的函数里面里面了,下面就要开始处理具体的业务逻辑了。
haohongfan
2021/10/20
1.1K0
Gin 路由注册与请求参数获取
RESTful(Representational State Transfer)代表的是一种基于HTTP协议设计的软件架构风格,它通常用于构建Web服务,是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。RESTful架构的设计理念是将资源表示为URI(统一资源标识符),通过HTTP协议的GET、POST、PUT、DELETE等方法对资源进行操作。以下是RESTful架构的一些关键特点:
贾维斯Echo
2024/01/05
4800
Gin 路由注册与请求参数获取
01 . Go之从零实现Web框架(框架雏形, 上下文Context,路由)
大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架。不同的框架设计理念和提供的功能有很大的差别。比如 Python 语言的 django和flask,前者大而全,后者小而美。Go语言/golang 也是如此,新框架层出不穷,比如Beego,Gin,Iris等。那为什么不直接使用标准库,而必须使用框架呢?在设计一个框架之前,我们需要回答框架核心为我们解决了什么问题。只有理解了这一点,才能想明白我们需要在框架中实现什么功能。
iginkgo18
2021/01/05
4760
gin 源码阅读(2) - http请求是如何流入gin的?
本篇文章是 gin 源码分析系列的第二篇,这篇文章我们主要弄清一个问题:一个请求通过 net/http 的 socket 接收到请求后, 是如何回到 gin 中处理逻辑的?
haohongfan
2021/10/08
1.1K0
Gin 框架怎么使用自定义验证器?
阅读上面这段代码,我们定义一个 validator.Func 类型的函数变量,参数入参的类型是 validator.FieldLevel,返回结果是一个 bool 类型的变量。
frank.
2024/11/19
2030
Gin 框架怎么使用自定义验证器?
Go 语言高性能 Web 框架 Gin 框架路由和请求参数的使用方式
使用 Web 框架,可以在开发项目时更高效。Web 框架一般会支持基础功能,比如路由、处理请求参数、渲染返回结果、中间件等。
frank.
2024/11/19
2110
Go 语言高性能 Web 框架 Gin 框架路由和请求参数的使用方式
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了。
KevinYan
2023/01/03
3.4K0
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
Gin中浮点数 NaN JSON序列化问题
作者:matrix 被围观: 261 次 发布时间:2024-12-24 分类:Golang | 无评论 »
HHTjim 部落格
2025/02/26
770
Gin中浮点数 NaN JSON序列化问题
通过分析gin、beego源码,读懂web框架对http请求处理流程的本质
大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。同时了解其底层的实现原理,以便更深入地了解Go语言。
Go学堂
2023/01/31
1.1K0
Gin框架核心源码走读
| 导语 最近考虑给SCF简单封一层web库,提供cgi的http协议处理、上下文、拦截器、html渲染等能力。很自然就想到了Gin框架,基于golang且框架比较轻量,这里简单把核心源码做个走读笔记
王昂
2020/01/25
3.1K0
Gin框架核心源码走读
相关推荐
gin 源码阅读(5) - 灵活的返回值处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档