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中文網其他相關文章!