自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Gin 框架怎么驗(yàn)證綁定到結(jié)構(gòu)體的字段?

開發(fā) 前端
本文我們介紹 Gin 框架怎么驗(yàn)證綁定到結(jié)構(gòu)體的字段,分為字段級(jí)驗(yàn)證(標(biāo)簽驗(yàn)證)和結(jié)構(gòu)體級(jí)驗(yàn)證,限于篇幅,本文我們先只介紹字段級(jí)驗(yàn)證。

1.介紹

在使用 Gin 框架開發(fā)項(xiàng)目時(shí),通常我們選擇模型綁定的方式接收請(qǐng)求參數(shù),我們?cè)谏弦槐槲恼轮?,已?jīng)介紹過(guò)使用 Gin 框架接收請(qǐng)求參數(shù)的常用方式。

本文我們主要介紹怎么驗(yàn)證綁定到結(jié)構(gòu)體的字段,順便補(bǔ)充關(guān)于模型綁定的一些內(nèi)容。

2.模型綁定

關(guān)于 Gin 框架的模型綁定,我們?cè)谏弦黄恼轮薪榻B了 ShouldBind 方法,該方式也是我們?cè)谑褂?Gin 框架開發(fā)項(xiàng)目時(shí),最常使用的方式。

一般使用場(chǎng)景

示例代碼:

package main

import "github.com/gin-gonic/gin"

func main() {
 r := gin.Default()
 r.GET("/login", func(c *gin.Context) {
  var login Login
  if err := c.ShouldBind(&login); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  c.JSON(200, gin.H{
   "data": login,
  })
 })
 r.Run()
}

type Login struct {
 User     string `form:"user"`
 Password string `form:"password"`
}

輸出結(jié)果:

curl -s -X GET http://127.0.0.1:8080/login\?user\=frank\&password\=123456 | jq
{
  "data": {
    "User": "frank",
    "Password": "123456"
  }
}

閱讀上面這段代碼,我們使用 GET 請(qǐng)求方式,需要給結(jié)構(gòu)體中的字段,添加 tag form。

需要注意的是,當(dāng)我們使用 ShouldBind 方式時(shí),如果使用 GET 請(qǐng)求方式,Gin 框架只會(huì)使用 form 標(biāo)簽;

如果使用 POST 請(qǐng)求方式,Gin 框架首先檢查 content-type 的值是否是 JSON 或 XML,若是,則使用 json 或 xml 標(biāo)簽,若不是,則再使用 form 標(biāo)簽。

特殊使用場(chǎng)景

示例代碼:

package main

import "github.com/gin-gonic/gin"

func main() {
 r := gin.Default()
 r.POST("/login", func(c *gin.Context) {
  var login Login
  var register Register
  if err := c.ShouldBind(&login); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  if err := c.ShouldBind(?ister); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  c.JSON(200, gin.H{
   "data":  login,
   "data2": register,
  })
 })
 r.Run()
}

type Login struct {
 User     string `form:"user" json:"user"`
 Password string `form:"password" json:"password"`
}

type Register struct {
 User     string `form:"user" json:"user"`
 Password string `form:"password" json:"password"`
}

輸出結(jié)果:

curl -s -X POST http://127.0.0.1:8080/login -H 'content-type: application/json' -d '{"user":"frank", "password": "123456"}' | jq
{
  "error": "EOF"
}

閱讀上面這段代碼,將同一次請(qǐng)求,綁定到多個(gè)結(jié)構(gòu)體,我們使用 ShouldBind 方式,得到的輸出結(jié)果是 EOF,這是因?yàn)?ShouldBind 使用了 Request.Body,它不可以重用。

當(dāng)使用一次 ShouldBind 之后,Request.Body 的值是 EOF,再次使用 ShoudBind 就會(huì)返回錯(cuò)誤。

我們可以使用 ShoudBindBodyWith 解決該問(wèn)題,ShouldBindBodyWith 在綁定之前會(huì)將 body 存儲(chǔ)到上下文中。

我們只需要修改上面這段代碼,即可實(shí)現(xiàn)多次綁定,示例代碼:

func main() {
 r := gin.Default()
 r.POST("/login", func(c *gin.Context) {
  var login Login
  var register Register
  if err := c.ShouldBindBodyWith(&login, binding.JSON); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  if err := c.ShouldBindBodyWith(?ister, binding.JSON); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  c.JSON(200, gin.H{
   "data":  login,
   "data2": register,
  })
 })
 r.Run()
}

需要注意的是,該方式會(huì)影響性能,所以盡量避免需要多次綁定的使用場(chǎng)景。

還有就是只有 JSON、XML、MsgPack、ProtoBuf 使用 ShouldBind 多次綁定,會(huì)出現(xiàn)該問(wèn)題。其它格式,可以使用 ShouldBind 多次綁定,并且不會(huì)影響性能。

3.驗(yàn)證

接下來(lái),我們介紹 Gin 框架綁定到結(jié)構(gòu)體的字段的驗(yàn)證方式。

Gin 框架提供了 2 種綁定方式,一種是我們已經(jīng)介紹的 ShouldBind*,該方式是 ShouldBindWith* 的快捷方式。ShouldBind* 和 ShouldBindWith* 方式可以返回錯(cuò)誤。

另一種是 Bind*,該方式是 MustBindWith* 的快捷方式。該方式不可以返回錯(cuò)誤,也就是如果發(fā)生綁定錯(cuò)誤,則請(qǐng)求終止。我們一般很少使用該方式。

我們使用 ShouldBind* 方式為例,介紹怎么驗(yàn)證綁定到結(jié)構(gòu)體的字段。

標(biāo)簽驗(yàn)證(字段級(jí)驗(yàn)證)

示例代碼:

package main

import (
 "github.com/gin-gonic/gin"
)

func main() {
 r := gin.Default()
 r.POST("/login", func(c *gin.Context) {
  var login Login
  if err := c.ShouldBind(&login); err != nil {
   c.JSON(200, gin.H{
    "error": err.Error(),
   })
   return
  }
  c.JSON(200, gin.H{
   "data": login,
  })
 })
 r.Run()
}

type Login struct {
 User     string `form:"user" json:"user" binding:"required"`
 Password string `form:"password" json:"password"`
}

輸出結(jié)果:

curl -s -X POST http://127.0.0.1:8080/login -H 'content-type: application/json' -d '{"user":"", "password": "123456"}' | jq
{
  "error": "Key: 'Login.User' Error:Field validation for 'User' failed on the 'required' tag"
}

curl -s -X POST http://127.0.0.1:8080/login -H 'content-type: application/json' -d '{"user":"frank", "password": "123456"}' | jq
{
  "error": "Key: 'Login.User' Error:Field validation for 'User' failed on the 'len' tag"
}

閱讀上面這段代碼,我們?cè)诮Y(jié)構(gòu)體 Login 的字段 User 標(biāo)簽中,新增 binding:"required,len=10",請(qǐng)求參數(shù)中,故意在請(qǐng)求時(shí)將 user 的值設(shè)置為空字符串和長(zhǎng)度不等于 10 的字符串,返回結(jié)果給出了驗(yàn)證錯(cuò)誤的信息。

實(shí)際上,Gin 框架使用 github.com/go-playground/validator/v10 進(jìn)行驗(yàn)證。

除了 required 和 len 之外,還有很多屬性,讀者朋友們可以閱讀 Validator 文檔[1]。

4總結(jié)

本文我們介紹 Gin 框架怎么驗(yàn)證綁定到結(jié)構(gòu)體的字段,分為字段級(jí)驗(yàn)證(標(biāo)簽驗(yàn)證)和結(jié)構(gòu)體級(jí)驗(yàn)證,限于篇幅,本文我們先只介紹字段級(jí)驗(yàn)證。

Gin 框架中的驗(yàn)證,使用的是三方庫(kù) validator,讀者朋友們可以閱讀其官方文檔,了解更多使用方式。

責(zé)任編輯:武曉燕 來(lái)源: Golang語(yǔ)言開發(fā)棧
相關(guān)推薦

2025-03-31 01:30:00

Gin框架模型

2024-02-19 07:40:10

2024-11-18 09:18:21

Gin框架驗(yàn)證器

2022-10-17 09:02:49

Go自動(dòng)驗(yàn)證數(shù)據(jù)綁定

2024-12-16 00:48:39

Gin框架函數(shù)

2022-01-09 23:04:19

語(yǔ)言打印結(jié)構(gòu)體

2024-12-09 00:00:15

Gin框架中間件

2020-11-26 10:08:17

Golang GinW

2022-12-26 00:00:01

Go框架前端

2020-12-10 10:22:48

GinWeb中間件HTTPS

2024-07-29 00:01:00

2024-03-05 07:55:41

框架GINGo

2024-11-25 08:14:09

Gin框架格式

2020-12-20 09:59:13

Go語(yǔ)言基礎(chǔ)技術(shù)

2024-12-24 10:50:05

GinWeb開發(fā)

2014-06-09 09:19:10

2023-07-29 15:03:29

2024-11-04 08:16:08

Go語(yǔ)言Web 框架

2009-08-13 11:18:50

C#結(jié)構(gòu)體

2021-04-20 09:00:48

Go 語(yǔ)言結(jié)構(gòu)體type
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)