第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的 HTTP 請求驗證中間件

Go 中的 HTTP 請求驗證中間件

Go
函數(shù)式編程 2023-03-07 17:26:57
我正在嘗試創(chuàng)建一個通用的 HTTP 請求驗證器中間件函數(shù),該函數(shù)接受類型(可能是 reflect.Type)作為參數(shù),然后使用該包github.com/go-playground/validator/v10將 JSON 解組為上述類型的結(jié)構(gòu)并驗證該結(jié)構(gòu)。我試圖用下面的示例代碼來解釋......例子type LoginRequestBody struct {   Username string `json:"username",validate:"required"`   Password string `json:"password",validate:"required"`}type SignupReqBody struct {   Username string `json:"username",validate:"required"`   Password string `json:"password",validate:"required"`   Age      int    `json:"age",validate:"required"`}// sample routers with a common middleware validator functionrouter.POST("/login", ReqValidate("LoginRequestBody"), LoginController)router.POST("/signup", ReqValidate("SignupReqBody"), SignupController)func ReqValidate(<something>) gin.HandlerFunc {   return func (c *gin.Context) {      // unmarshalling JSON into a struct      // common validation logic...      c.Next()   }}總的來說,我想使用 Joi 包實現(xiàn)與 Node.js 中相同的驗證器靈活性。
查看完整描述

2 回答

?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗 獲得超11個贊

我不知道是否有必要使用中間件,但我最近嘗試做一些事情,我發(fā)現(xiàn)了一個很棒的教程,您可以在此處查看。


使用 Gin 您可以使用綁定:


例子:


package main

import (

  "github.com/gin-gonic/gin"

  "net/http"

)

type AnyStruct struct {

   Price uint `json:"price" binding:"required,gte=10,lte=1000"`

}

func main() {

  engine:=gin.New()

  engine.POST("/test", func(context *gin.Context) {

     body:=AnyStruct{}

     if err:=context.ShouldBindJSON(&body);err!=nil{

        context.AbortWithStatusJSON(http.StatusBadRequest,

        gin.H{

            "error": "VALIDATEERR-1",

            "message": "Invalid inputs. Please check your inputs"})

        return

     }

     context.JSON(http.StatusAccepted,&body)

  })

  engine.Run(":3000")

}


查看完整回答
反對 回復(fù) 2023-03-07
?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗 獲得超9個贊

不要使用逗號分隔結(jié)構(gòu)標(biāo)簽鍵值對,使用空格。


您可以使用泛型(類型參數(shù))來替換<something>,但您的控制器需要將具體類型作為它們的參數(shù)。


例如:


func ReqValidate[T any](next func(*gin.Context, *T)) gin.HandlerFunc {

    return func(c *gin.Context) {

        params := new(T)

        if err := c.ShouldBindJSON(params); err != nil {

            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})

            return

        }

        next(c, params)

    }

}

然后是控制器:


type LoginRequestBody struct {

    Username string `json:"username" validate:"required"`

    Password string `json:"password" validate:"required"`

}


func LoginController(c *gin.Context, params *LoginRequestBody) {

    // ...

}


type SignupReqBody struct {

    Username string `json:"username" validate:"required"`

    Password string `json:"password" validate:"required"`

    Age      int    `json:"age" validate:"required"`

}


func SignupController(c *gin.Context, params *SignupReqBody) {

    // ...

}

然后是路由:


router := gin.Default()

router.POST("/login", ReqValidate(LoginController))

router.POST("/signup", ReqValidate(SignupController))


查看完整回答
反對 回復(fù) 2023-03-07
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號