首頁 > 後端開發 > Golang > 使用兩個可能的名稱驗證輸入字段

使用兩個可能的名稱驗證輸入字段

王林
發布: 2024-02-08 22:33:08
轉載
1022 人瀏覽過

使用兩個可能的名稱驗證輸入字段

php小編草莓為您介紹一種驗證輸入欄位的方法:使用兩個可能的名稱進行驗證。在開發網站或應用程式時,輸入欄位的驗證是非常重要的一步。透過使用兩個可能的名稱,可以增加輸入欄位的安全性和準確性。這種方法是透過將輸入欄位的實際名稱與一個備用名稱進行比較來進行驗證的。如果兩個名稱都匹配,那麼輸入欄位被視為有效。這種驗證方法可以避免使用者輸入錯誤或惡意輸入所導致的問題,並提供更可靠的資料保護。

問題內容

我正在遷移最初用 Python 寫的 API。 Python API 可讓您以camelCase 或snake_case 形式傳送請求,如下所示:

這是允許的

<code>{
    "someInput": "nice"
}
</code>
登入後複製

這是允許的

<code>{
    "some_input": "nice"
}
</code>
登入後複製

這是使用一個很棒的 Python 函式庫完成的:Pydantic

<code>from pydantic import BaseModel

def to_camel(string):
    words = string.split('_')
    return words[0] + ''.join(word.capitalize() for word in words[1:])

class InputModel(BaseModel):
    some_input: str

    class Config:
        alias_generator = to_camel
        allow_population_by_field_name = True
</code>
登入後複製

這允許透過別名(someInput)或欄位名稱(some_input)建立InputModel。 我想在 Go 中做相同或等效的事情。我正在使用杜松子酒:

<code>func Routes(router *gin.Engine) {
    v1 := router.Group("/v1")
    {
        v1.POST("/shipments", controllers.ShipmentCreator)
    }
}

func ShipmentCreator(ctx *gin.Context) {
    ResponseController := new(internal.OutputModel)
    var body domain.ShipmentsInputModel
    if err := ctx.BindJSON(&body); err != nil {
        fmt.Println(err)
    }
    validate := validator.New()
    err := validate.Struct(body)
    if err != nil {
        var validationErrors validator.ValidationErrors
        errors.As(err, &validationErrors)
        for _, validationError := range validationErrors {
            ResponseController.AddError(internal.ErrorsModel{
                Parameter: validationError.Field(),
                Message:   validationError.Error(),
            })
        }
        ctx.JSON(http.StatusBadRequest, ResponseController)
        return
    }

</code>
登入後複製

我的輸入結構看起來像這樣:

<code>type ShipmentsInputModel struct {
    LotId   string   `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"`
}
</code>
登入後複製

當我的輸入是:

時,這不起作用
<code>{
   "lot_id": "someLotId"
}
</code>
登入後複製

它回傳:

"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",
登入後複製

我怎麼能同時接受camelCase和snake_case?

解決方法

在 Go 中,您無法為單一結構體欄位同時提供兩個 JSON 標籤。 JSON 標籤使用單一字串指定,它們用於定義應如何對欄位進行封送(序列化為 JSON)或取消封送(從 JSON 反序列化)。您不能直接為結構中的單一欄位指定多個標籤。

如果您需要在 JSON 輸出中支援 CamelCase 和 SnakeCase,您通常必須為結構欄位選擇一致的命名約定,然後為所有欄位使用適當的 JSON 標記。

有一個巧妙的方法可以做到這一點。我希望這會有所幫助。

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type ShipmentsInputModel struct {
        LotID
    }
    
    type LotID struct {
        LotId  string `json:"lotId,omitempty"`
        Lot_ID string `json:"lot_id,omitempty"`
    }
    
    func (s *ShipmentsInputModel) setLodID(id string) {
        s.LotId = id
        s.Lot_ID = id
    }
    
    func main() {
        shipment := ShipmentsInputModel{}
        shipment.setLodID("someLotID")
    
        // Convert struct to JSON
        jsonData, err := json.Marshal(shipment)
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        // prints: {"lotId":"someLotID","lot_id":"someLotID"}
        fmt.Println(string(jsonData))
    }
登入後複製

以上是使用兩個可能的名稱驗證輸入字段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板