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

开发 前端
本文我们介绍 Gin 框架怎么实现验证请求参数和返回响应数据的函数。我们通过三个步骤完成,第一,创建返回响应数据的函数;第二,创建验证请求参数和返回响应数据的整合函数;第三,创建返回响应数据的中间件函数。

1.介绍

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

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

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

2.请求参数验证和返回响应数据

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

type Response struct {
 Code int                    `json:"code"`
 Msg  string                 `json:"msg"`
 Data map[string]interface{} `json:"data"`
}

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

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

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

返回响应数据

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

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 的存储数据,通过 Set 和 Get 方法,设置和获取数据。

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

请求参数验证

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

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。

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

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

3.响应数据返回中间件

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

示例代码:

// ResponseReturn middleware
func ResponseReturn() gin.HandlerFunc {
 return func(c *gin.Context) {
  data := GetData(c)
  c.Render(http.StatusOK, ReturnJson{Data: data})
 }
}

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

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

源码:

type Render interface {
    Render(http.ResponseWriter) error
    WriteContentType(w http.ResponseWriter)
}

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

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

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,并创建两个方法 Render 和 WriteContentType,从而实现接口类型 render.Render,作为 c.Render 的参数。

4.总结

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

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

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

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2024-11-04 08:16:08

Go语言Web 框架

2022-12-26 00:00:01

Go框架前端

2024-11-11 00:45:54

Gin框架字段

2022-10-17 09:02:49

Go自动验证数据绑定

2020-11-26 10:08:17

Golang GinW

2024-11-18 09:18:21

Gin框架验证器

2024-02-19 07:40:10

2024-11-25 08:14:09

Gin框架格式

2024-01-30 12:08:31

Go框架停止服务

2024-01-22 08:46:37

MyBatis数据脱敏Spring

2024-12-09 00:00:15

Gin框架中间件

2016-11-04 08:53:05

androidjava单元测试

2023-11-28 14:32:04

2022-03-13 23:51:39

Web项目Go

2019-01-27 14:37:47

数据HTTP服务

2022-12-16 12:07:06

2023-03-06 08:37:58

JavaNIO

2010-10-25 10:10:08

oracle函数

2009-07-31 14:20:46

结构数组C#函数的参数

2024-11-01 10:40:32

点赞
收藏

51CTO技术栈公众号