Validieren Sie Eingabefelder mit zwei möglichen Namen

王林
Freigeben: 2024-02-08 22:33:08
nach vorne
985 Leute haben es durchsucht

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>
Nach dem Login kopieren

Das ist erlaubt

<code>{
    "some_input": "nice"
}
</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Meine Eingabestruktur sieht so aus:

<code>type ShipmentsInputModel struct {
    LotId   string   `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"`
}
</code>
Nach dem Login kopieren

Das funktioniert nicht, wenn meine Eingabe ist:

<code>{
   "lot_id": "someLotId"
}
</code>
Nach dem Login kopieren

Es kehrt zurück:

"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",
Nach dem Login kopieren

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))
    }
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!