Heim >Backend-Entwicklung >Golang >Validieren Sie Eingabefelder mit zwei möglichen Namen
php-Editor Strawberry stellt Ihnen eine Methode zur Validierung von Eingabefeldern vor: Verwenden Sie zwei mögliche Namen zur Validierung. Die Validierung von Eingabefeldern ist ein sehr wichtiger Schritt bei der Entwicklung einer Website oder Anwendung. Durch die Verwendung zweier möglicher Namen können Sie die Sicherheit und Genauigkeit Ihrer Eingabefelder erhöhen. Diese Methode validiert, indem sie den tatsächlichen Namen des Eingabefelds mit einem alternativen Namen vergleicht. Stimmen beide Namen überein, gilt das Eingabefeld als gültig. Diese Überprüfungsmethode vermeidet Probleme, die durch Benutzereingabefehler oder böswillige Eingaben verursacht werden, und bietet einen zuverlässigeren Datenschutz.
Ich migriere eine API, die ursprünglich in Python geschrieben wurde. Mit der Python-API können Sie Anfragen in der Form „camelCase“ oder „snake_case“ wie folgt senden:
Das ist erlaubt
<code>{ "someInput": "nice" } </code>
Das ist erlaubt
<code>{ "some_input": "nice" } </code>
Dies geschieht mithilfe einer großartigen Python-Bibliothek: 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>
Dies ermöglicht die Erstellung von InputModels nach Alias (someInput) oder Feldnamen (some_input). Ich möchte das Gleiche oder ein Äquivalent in Go machen. Ich verwende 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>
Meine Eingabestruktur sieht so aus:
<code>type ShipmentsInputModel struct { LotId string `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"` } </code>
Das funktioniert nicht, wenn meine Eingabe ist:
<code>{ "lot_id": "someLotId" } </code>
Es kehrt zurück:
"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",
Wie kann ich sowohl camelCase als auch Snake_case akzeptieren?
In Go können Sie nicht zwei JSON-Tags gleichzeitig für ein einzelnes Strukturfeld bereitstellen. JSON-Tags werden mithilfe einer einzelnen Zeichenfolge angegeben, die definiert, wie ein Feld gemarshallt (serialisiert zu JSON) oder entmarshallt (deserialisiert von JSON) werden soll. Sie können nicht direkt mehrere Beschriftungen für ein einzelnes Feld in einer Struktur angeben.
Wenn Sie CamelCase und SnakeCase in der JSON-Ausgabe unterstützen müssen, müssen Sie normalerweise eine konsistente Namenskonvention für die Strukturfelder wählen und dann das entsprechende JSON-Markup für alle Felder verwenden.
Es gibt eine clevere Möglichkeit, dies zu tun. Ich hoffe das hilft.
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)) }
Das obige ist der detaillierte Inhalt vonValidieren Sie Eingabefelder mit zwei möglichen Namen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!