成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Gin 框架怎么實現(xiàn)驗證請求參數(shù)和返回響應數(shù)據(jù)的函數(shù)?

開發(fā) 前端
本文我們介紹 Gin 框架怎么實現(xiàn)驗證請求參數(shù)和返回響應數(shù)據(jù)的函數(shù)。我們通過三個步驟完成,第一,創(chuàng)建返回響應數(shù)據(jù)的函數(shù);第二,創(chuàng)建驗證請求參數(shù)和返回響應數(shù)據(jù)的整合函數(shù);第三,創(chuàng)建返回響應數(shù)據(jù)的中間件函數(shù)。

1.介紹

在使用 Gin 框架開發(fā)時,入口函數(shù)通常需要支持驗證請求參數(shù)和返回響應數(shù)據(jù)。

我們可以將驗證請求參數(shù)和返回響應數(shù)據(jù)整合為一個通用函數(shù)。

然后,結合響應數(shù)據(jù)返回中間件,實現(xiàn)通過一個函數(shù),實現(xiàn)驗證請求參數(shù)和返回響應數(shù)據(jù) 的功能。

2.請求參數(shù)驗證和返回響應數(shù)據(jù)

首先,我們需要定義一個自定義結構體類型 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{} 變量類型,可以支持任意類型的響應數(shù)據(jù)。

此外,我們還可以根據(jù)項目需求,添加其它字段,比如 TraceId,Error 等。

返回響應數(shù)據(jù)

接下來,我們創(chuàng)建一個返回響應數(shù)據(jù)的函數(shù),示例代碼:

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 的存儲數(shù)據(jù),通過 Set 和 Get 方法,設置和獲取數(shù)據(jù)。

需要注意的是,使用 gin.Context 存儲的數(shù)據(jù)是 interface{} 類型,所以,在我們使用該數(shù)據(jù)時,需要先通過斷言,檢查該數(shù)據(jù)的類型是否合法。

請求參數(shù)驗證

接下來,我們創(chuàng)建一個驗證請求參數(shù)和返回響應數(shù)據(jù)的函數(shù) ValidatorAndReturn,示例代碼:

func ValidatorAndReturn(c *gin.Context, arg interface{}) (data *Response, err error) {
 data = GetData(c)
 err = c.ShouldBind(arg)
 if err != nil {
  return
 }
 return
}

閱讀上面這段代碼,我們定義一個函數(shù),接收參數(shù)是 *gin.Context 類型的變量 c,和 interface{} 類型的變量 arg,返回結果是 *Response 類型的 data 和 error 類型的 err。

函數(shù)體中,包含自定義函數(shù) GetData 和 ShouldBind 方法。讀者朋友們,可以根據(jù)自己的項目,優(yōu)化驗證請求參數(shù)的代碼。

需要注意的是,嚴格意義上講,此處 GetData 函數(shù)并未提供 Gin 框架入口函數(shù)自動返回響應數(shù)據(jù)的功能。我們需要通過中間件實現(xiàn)該功能。

3.響應數(shù)據(jù)返回中間件

最后,我們需要創(chuàng)建一個中間件函數(shù) ResponseReturn,使 Gin 框架的入口函數(shù)自動返回響應數(shù)據(jù)。

示例代碼:

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

閱讀上面這段代碼,我們定義一個中間件函數(shù) ResponseReturn,使用 gin.Context 的 Render 方法,返回響應數(shù)據(jù)。

需要注意的是 Render 的第二個參數(shù)是 render.Render 類型。

源碼:

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

閱讀 Gin 框架源碼,我們可以發(fā)現(xiàn) render.Render 是一個接口類型,包含兩個方法,分別是 Render 和 WriteContentType。

所以,我們定義了一個結構體 ReturnJson,并實現(xiàn) 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,并創(chuàng)建兩個方法 Render 和 WriteContentType,從而實現(xiàn)接口類型 render.Render,作為 c.Render 的參數(shù)。

4.總結

本文我們介紹 Gin 框架怎么實現(xiàn)驗證請求參數(shù)和返回響應數(shù)據(jù)的函數(shù)。

我們通過三個步驟完成,第一,創(chuàng)建返回響應數(shù)據(jù)的函數(shù);第二,創(chuàng)建驗證請求參數(shù)和返回響應數(shù)據(jù)的整合函數(shù);第三,創(chuàng)建返回響應數(shù)據(jù)的中間件函數(shù)。

本文所用到的代碼,我們在之前的文章中都介紹過,讀者朋友們?nèi)绻胁幻靼椎拇a,可以翻閱之前的文章。

責任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關推薦

2022-12-26 00:00:01

Go框架前端

2024-11-04 08:16:08

Go語言Web 框架

2024-11-11 00:45:54

Gin框架字段

2024-11-18 09:18:21

Gin框架驗證器

2025-03-31 01:30:00

Gin框架模型

2020-11-26 10:08:17

Golang GinW

2022-10-17 09:02:49

Go自動驗證數(shù)據(jù)綁定

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數(shù)據(jù)脫敏Spring

2024-12-09 00:00:15

Gin框架中間件

2023-11-28 14:32:04

2016-11-04 08:53:05

androidjava單元測試

2022-03-13 23:51:39

Web項目Go

2010-10-25 10:10:08

oracle函數(shù)

2023-03-06 08:37:58

JavaNIO

2019-01-27 14:37:47

數(shù)據(jù)HTTP服務

2022-12-16 12:07:06

2009-07-31 14:20:46

結構數(shù)組C#函數(shù)的參數(shù)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本中文在线 | 美女视频一区二区三区 | 欧美日韩国产一区二区三区 | 精品国产乱码久久久久久牛牛 | 夜色www国产精品资源站 | 精品一区二区三区免费毛片 | 日韩精品一区二区不卡 | 精品欧美一区二区三区久久久 | 欧美a在线看 | 日韩欧美高清 | 国产免费一区二区三区网站免费 | 国产免费观看久久黄av片涩av | 欧美一区二区三区在线播放 | 中国三级黄色录像 | 波多野结衣中文字幕一区二区三区 | 在线免费观看黄网 | 欧美乱人伦视频 | 成人免费视频网站在线看 | 在线观看亚洲精品视频 | 久久久久国产精品一区二区 | av中文字幕在线播放 | 天天干狠狠操 | 久操亚洲| 日韩天堂av | 黄色大片在线 | 亚洲三级av | 久久精品色欧美aⅴ一区二区 | 久久精品一区二区三区四区 | 成人欧美一区二区三区在线播放 | 成年精品| 免费毛片网站 | 在线观看av网站永久 | 日韩精品视频在线免费观看 | 国产xxxx在线 | 亚洲成人高清 | 欧美vide| 久国久产久精永久网页 | 操久久 | 欧美久久一区 | 在线观看中文字幕 | 韩日在线观看视频 |