Home >Backend Development >Golang >Validate input fields using two possible names
php Xiaobian Strawberry introduces you a method to verify the input field: use two possible names for verification. Validation of input fields is a very important step when developing a website or application. By using two possible names, you can increase the security and accuracy of your input fields. This method validates by comparing the actual name of the input field with an alternate name. If both names match, the input field is considered valid. This verification method avoids problems caused by user input errors or malicious input and provides more reliable data protection.
I am migrating an API originally written in Python. The Python API allows you to send requests as camelCase or snake_case as follows:
This is allowed
<code>{ "someInput": "nice" } </code>
This is allowed
<code>{ "some_input": "nice" } </code>
This is done using a great Python library: 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>
This allows the creation of InputModels by alias (someInput) or field name (some_input). I want to do the same or equivalent thing in Go. I'm using gin:
<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>
My input structure looks like this:
<code>type ShipmentsInputModel struct { LotId string `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"` } </code>
This doesn't work when my input is:
<code>{ "lot_id": "someLotId" } </code>
It returns:
"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",
How can I accept both camelCase and snake_case?
In Go, you cannot provide two JSON tags for a single struct field at the same time. JSON tags are specified using a single string that defines how a field should be marshaled (serialized to JSON) or unmarshaled (deserialized from JSON). You cannot directly specify multiple labels for a single field in a structure.
If you need to support CamelCase and SnakeCase in JSON output, you typically have to choose a consistent naming convention for the structure fields and then use the appropriate JSON markup for all fields.
There is a clever way to do this. I hope this helps.
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)) }
The above is the detailed content of Validate input fields using two possible names. For more information, please follow other related articles on the PHP Chinese website!