Heim >Backend-Entwicklung >Golang >Validieren Sie Eingabefelder mit zwei möglichen Namen

Validieren Sie Eingabefelder mit zwei möglichen Namen

王林
王林nach vorne
2024-02-08 22:33:081031Durchsuche

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.

Frageninhalt

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?

Problemumgehung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen